9os

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 085575ac98cb0ddcefbfbde0c6123dc4b1a5371f
parent 653911418286685682f182efffb71d66b0aa29bf
Author: Roberto Vargas <roberto.vargas@arm.com>
Date:   Fri, 23 Nov 2018 17:37:55 +0000

[libk/libc] Make simpler getenv() and putenv()

Change-Id: I9acd7cb9b1788868bf7c20849acdba58fe32ce5e

Diffstat:
Minclude/bits/rmode/arch/stdlib.h | 7+++++++
Minclude/rcode.h | 1+
Msrc/libc/arch/posix/getenv.c | 14+++++---------
Msrc/libc/arch/rmode/rcode/Makefile | 2--
Dsrc/libc/arch/rmode/rcode/_environ.s | 8--------
Msrc/libc/arch/rmode/rcode/getenv.c | 20+++++++++++---------
Msrc/libk/putenv-native.c | 30+++++++++++++-----------------
Mtarget/native/crt.s | 8+-------
Mtarget/native/rom.c | 15++++++++++++---
9 files changed, 50 insertions(+), 55 deletions(-)

diff --git a/include/bits/rmode/arch/stdlib.h b/include/bits/rmode/arch/stdlib.h @@ -3,6 +3,13 @@ typedef unsigned long size_t; #define SIZET_ #endif +struct _Env { + int nvars; + char *vars[]; +}; + +extern struct _Env *_environ(); + #define EXIT_FAILURE 1 #define EXIT_SUCCESS 0 diff --git a/include/rcode.h b/include/rcode.h @@ -56,6 +56,7 @@ struct bssmap { unsigned char dumpstack; unsigned char backtrace; void *text; + void *environ; size_t bsssize; void *uartbase; diff --git a/src/libc/arch/posix/getenv.c b/src/libc/arch/posix/getenv.c @@ -7,16 +7,12 @@ extern char **_environ; char * getenv(const char *name) { - char **p; + char **p, *s; size_t len = strlen(name); - for (p = _environ; *p; ++p) { - if (!strncmp(name, *p, len) && (*p)[len] == '=') - break; + for (p = _environ; s = *p; ++p) { + if (!strncmp(name, s, len) && s[len] == '=') + return s + len + 1; } - - if (!*p) - return NULL; - - return &(*p)[len]; + return NULL; } diff --git a/src/libc/arch/rmode/rcode/Makefile b/src/libc/arch/rmode/rcode/Makefile @@ -8,9 +8,7 @@ OBJS = _Exit.o \ _write.o \ _sys_errlist.o \ _read.o \ - _environ.o \ getenv.o \ - putenv.o \ all: $(OBJS) diff --git a/src/libc/arch/rmode/rcode/_environ.s b/src/libc/arch/rmode/rcode/_environ.s @@ -1,8 +0,0 @@ - .text - .globl _environ - -_environ: - mov x0,sp - mov x1,#(~4095) - and x0,x0,x1 - ret diff --git a/src/libc/arch/rmode/rcode/getenv.c b/src/libc/arch/rmode/rcode/getenv.c @@ -1,22 +1,24 @@ #include <stdlib.h> #include <string.h> + #undef getenv -extern char **_environ(); +extern void *getenviron(void); char * getenv(const char *name) { - char **p; + int i; + char *s; + struct _Env *envp; size_t len = strlen(name); - for (p = _environ() + 1; *p; ++p) { - if (!strncmp(name, *p, len) && (*p)[len] == '=') + envp = getenviron(); + for (i = 0; i < envp->nvars; i++) { + if ((s = envp->vars[i]) == NULL) break; + if (!strncmp(name, s, len) && s[len] == '=') + return s + len + 1; } - - if (!*p) - return NULL; - - return &(*p)[len]; + return NULL; } diff --git a/src/libk/putenv-native.c b/src/libk/putenv-native.c @@ -2,14 +2,15 @@ #include <stdlib.h> #include <string.h> -extern char **_environ(); +extern void *getenviron(void); int putenv(char *name) { - char **p, **env, *s; + int i; + char *s; + struct _Env *envp; size_t len; - int *nump; if ((s = strchr(name, '=')) == NULL) { errno = EINVAL; @@ -17,24 +18,19 @@ putenv(char *name) } len = s - name; - env = _environ(); - for (p = env + 1; *p; ++p) { - if (!strncmp(name, *p, len) && (*p)[len] == '=') + envp = getenviron(); + for (i = 0; i < envp->nvars; i++) { + if ((s = envp->vars[i]) == NULL) + break; + if (!strncmp(name, s, len) && s[len] == '=') break; } - if (*p) { - *p = name; - } else { - nump = (int *) env; - if (*nump == 0) { - errno = ENOMEM; - return -1; - } - --*nump; - *p++ = name; - *p = NULL; + if (i == envp->nvars) { + errno = ENOMEM; + return -1; } + envp->vars[i] = name; return 0; } diff --git a/target/native/crt.s b/target/native/crt.s @@ -3,7 +3,7 @@ SRAMADDR = 0x2E00F000 SRAMSIZE = 4096 .text - .globl _start,_environ + .globl _start _start: bl getpc getpc: @@ -43,12 +43,6 @@ initmem: b.ne initmem ret -_environ: - mov x0,sp - mov x1,#(~4095) - and x0,x0,x1 - ret - .section .rodata outsync: .asciz "out of sync" diff --git a/target/native/rom.c b/target/native/rom.c @@ -8,8 +8,8 @@ #include "sysreg.h" #include "arch.h" -#define ENVPOS 8 -#define ENVSIZ (ENVPOS * sizeof(char **)) +#define ENVPOS 7 +#define ENVSIZ (sizeof(struct _Env) + ENVPOS*sizeof(char *)) #define BSSSIZ 1024 typedef struct mach Mach; @@ -34,6 +34,12 @@ geterrno(void) return &bss->errno_; } +struct _Env * +getenviron(void) +{ + return bss->environ; +} + static void imach(Mach *mp, void *txt, size_t txtsiz, void *ram, size_t ramsiz) { @@ -55,7 +61,6 @@ imach(Mach *mp, void *txt, size_t txtsiz, void *ram, size_t ramsiz) mp->stacksiz = bp - ramp; mp->envsiz = ENVSIZ; - ((int *) mp->env)[ENVPOS-1] = ENVPOS-1; mp->bsssiz = BSSSIZ; fp->sp = mp->sp; @@ -69,12 +74,16 @@ imach(Mach *mp, void *txt, size_t txtsiz, void *ram, size_t ramsiz) static void ibss(Mach *mp) { + struct _Env *envp; + wsysreg(TPIDR_R, (uintptr_t) mp->bss_); bss->text = mp->txt; bss->backtrace = 1; bss->dumpstack = 1; bss->uartbase = (void *)UARTBASE; bss->bsssize = sizeof(struct bssmap); + envp = bss->environ = mp->env; + envp->nvars = ENVPOS; } static void