From a53be3819869a3210127c0ac9fd589effdad909c Mon Sep 17 00:00:00 2001 From: David Given Date: Mon, 19 Oct 2015 20:19:35 +0200 Subject: [PATCH] Backport the ugetp/uputp changes from upstream. --- Kernel/cpu-msp430x/cpu.h | 1 + Kernel/syscall_exec16.c | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Kernel/cpu-msp430x/cpu.h b/Kernel/cpu-msp430x/cpu.h index 9a14e5a4..6fbfdef7 100644 --- a/Kernel/cpu-msp430x/cpu.h +++ b/Kernel/cpu-msp430x/cpu.h @@ -19,6 +19,7 @@ typedef uint8_t irqflags_t; typedef uint16_t arg_t; typedef uint16_t uarg_t; typedef uint16_t uaddr_t; +typedef uint16_t uptr_t; typedef uint16_t usize_t; /* Largest value passed by userspace */ typedef int16_t susize_t; typedef uint32_t clock_t; diff --git a/Kernel/syscall_exec16.c b/Kernel/syscall_exec16.c index 40ff5e34..219c83d6 100644 --- a/Kernel/syscall_exec16.c +++ b/Kernel/syscall_exec16.c @@ -206,7 +206,7 @@ arg_t _execve(void) that on 8bit boxes, but defer it to brk/sbrk() */ uzero((uint8_t *)progptr, bss); - // Set initial break for program + /* Set initial break for program */ udata.u_break = (int)ALIGNUP(progptr + bss); /* Turn off caught signals */ @@ -263,13 +263,15 @@ nogood3: bool rargs(char **userspace_argv, struct s_argblk * argbuf) { char *ptr; /* Address of base of arg strings in user space */ + char *up = (char *)userspace_argv; uint8_t c; uint8_t *bufp; argbuf->a_argc = 0; /* Store argc in argbuf */ bufp = argbuf->a_buf; - while ((ptr = (char *) ugetw(userspace_argv++)) != NULL) { + while ((ptr = (char *) ugetp(up)) != NULL) { + up += sizeof(uptr_t); ++(argbuf->a_argc); /* Store argc in argbuf. */ do { *bufp++ = c = ugetc(ptr++); @@ -287,9 +289,9 @@ bool rargs(char **userspace_argv, struct s_argblk * argbuf) char **wargs(char *ptr, struct s_argblk *argbuf, int *cnt) // ptr is in userspace { - char **argv; /* Address of users argv[], just below ptr */ + char *argv; /* Address of users argv[], just below ptr */ int argc, arglen; - char **argbase; + char *argbase; uint8_t *sptr; sptr = argbuf->a_buf; @@ -303,7 +305,7 @@ char **wargs(char *ptr, struct s_argblk *argbuf, int *cnt) // ptr is in userspac /* Set argv to point below the argument strings */ argc = argbuf->a_argc; - argbase = argv = (char **) ptr - (argc + 1); + argbase = argv = ptr - sizeof(uptr_t) * (argc + 1); if (cnt) { *cnt = argc; @@ -311,15 +313,16 @@ char **wargs(char *ptr, struct s_argblk *argbuf, int *cnt) // ptr is in userspac /* Set each element of argv[] to point to its argument string */ while (argc--) { - uputw((uint16_t) ptr, argv++); + uputp((uptr_t) ptr, argv); + argv += sizeof(uptr_t); if (argc) { do ++ptr; while (*sptr++); } } - uputw(0, argv); /*;;26Feb- Add Null Pointer to end of array */ - return ((char **) argbase); + uputp(0, argv); /*;;26Feb- Add Null Pointer to end of array */ + return (char **) argbase; } /* -- 2.34.1