Added APIs to access process startup information
authorDavide Libenzi <dlibenzi@google.com>
Thu, 22 Oct 2015 17:56:37 +0000 (10:56 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 18 Nov 2015 17:54:57 +0000 (09:54 -0800)
Added APIs to access process startup information. For now only argc and
argv copies are supported.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/elf.h
kern/src/elf.c

index 2f6720c..ed0515c 100644 (file)
@@ -150,3 +150,6 @@ struct file;
 bool is_valid_elf(struct file *f);
 int load_elf(struct proc* p, struct file* f,
              int argc, char *argv[], int envc, char *envp[]);
+ssize_t get_startup_argc(struct proc *p);
+char *get_startup_argv(struct proc *p, size_t idx, char *argp,
+                                          size_t max_size);
index e73e457..8a15f2f 100644 (file)
@@ -403,3 +403,38 @@ int load_elf(struct proc* p, struct file* f,
        return 0;
 }
 
+ssize_t get_startup_argc(struct proc *p)
+{
+       const char *sptr = (const char *) p->args_base;
+       ssize_t argc = 0;
+
+       /* TODO,DL: Use copy_from_user() when available.
+        */
+       if (memcpy_from_user(p, &argc, sptr, sizeof(size_t)))
+               return -1;
+
+       return argc;
+}
+
+char *get_startup_argv(struct proc *p, size_t idx, char *argp,
+                                          size_t max_size)
+{
+       size_t stack_space = (const char *) USTACKTOP - (const char *) p->args_base;
+       const char *sptr = (const char *) p->args_base + sizeof(size_t) +
+               idx * sizeof(char *);
+       const char *argv = NULL;
+
+       /* TODO,DL: Use copy_from_user() when available.
+        */
+       if (memcpy_from_user(p, &argv, sptr, sizeof(char *)))
+               return NULL;
+
+       /* TODO,DL: Use strncpy_from_user() when available.
+        */
+       max_size = MIN(max_size, stack_space);
+       if (memcpy_from_user(p, argp, argv, max_size))
+               return NULL;
+       argp[max_size - 1] = 0;
+
+       return argp;
+}