Changeset c98e6ee in mainline for uspace


Ignore:
Timestamp:
2008-07-08T16:05:45Z (17 years ago)
Author:
Jiri Svoboda <jirik.svoboda@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f93f168
Parents:
b7f9087
Message:

Merge program-loader related stuff from dynload branch to trunk. (huge)

Location:
uspace
Files:
35 added
20 edited

Legend:

Unmodified
Added
Removed
  • uspace/Makefile

    rb7f9087 rc98e6ee  
    3838        lib/softfloat \
    3939        srv/ns \
     40        srv/loader \
    4041        srv/fb \
    4142        srv/kbd \
     
    4849        app/tetris \
    4950        app/tester \
     51        app/cli \
    5052        app/klog \
    5153        app/init
  • uspace/app/init/init.c

    rb7f9087 rc98e6ee  
    4646#include "version.h"
    4747
    48 #define BUF_SIZE 150000
    49 
    50 static char *buf;
    51 
    5248static void console_wait(void)
    5349{
     
    8379static void spawn(char *fname)
    8480{
     81        char *argv[2];
     82
    8583        printf(NAME ": Spawning %s\n", fname);
    86        
    87         int fd = open(fname, O_RDONLY);
    88         if (fd >= 0) {
    89        
    90                 ssize_t rd;
    91                 size_t len = 0;
    92                
    93                 // FIXME: cannot do long reads yet
    94                 do {
    95                         rd = read(fd, buf + len, 1024);
    96                         if (rd > 0)
    97                                 len += rd;
    98                        
    99                 } while (rd > 0);
    100                
    101                 if (len > 0) {
    102                         task_spawn(buf, len);
    103                         sleep(1);       // FIXME
    104                 }
    105                
    106                 close(fd);
     84
     85        argv[0] = fname;
     86        argv[1] = NULL;
     87
     88        if (task_spawn(fname, argv) != 0) {
     89                /* Success */
     90                sleep(1);
    10791        }
    10892}
     
    118102        }
    119103       
    120         buf = malloc(BUF_SIZE);
    121        
    122104        // FIXME: spawn("/sbin/pci");
    123105        spawn("/sbin/fb");
     
    130112        spawn("/sbin/fat");
    131113        spawn("/sbin/tetris");
     114        spawn("/sbin/cli");
    132115        // FIXME: spawn("/sbin/tester");
    133116        spawn("/sbin/klog");
    134117       
    135         free(buf);
    136118        return 0;
    137119}
  • uspace/app/tester/tester.c

    rb7f9087 rc98e6ee  
    108108}
    109109
    110 int main(void)
     110int main(int argc, char **argv)
    111111{
     112        printf("Number of arguments: %d\n", argc);
     113        if (argv) {
     114                printf("Arguments:");
     115                while (*argv) {
     116                        printf(" '%s'", *argv++);
     117                }
     118                printf("\n");
     119        }
     120
    112121        while (1) {
    113122                char c;
  • uspace/lib/libc/Makefile

    rb7f9087 rc98e6ee  
    5252        generic/string.c \
    5353        generic/fibril.c \
     54        generic/pcb.c \
     55        generic/smc.c \
    5456        generic/thread.c \
    5557        generic/tls.c \
  • uspace/lib/libc/arch/amd64/src/entry.s

    rb7f9087 rc98e6ee  
    3535## User-space task entry point
    3636#
     37# %rdi contains the PCB pointer
    3738#
    3839__entry:
     40        # %rdi was deliberately chosen as the first argument is also in %rdi
     41        # Pass PCB pointer to __main (no operation)
    3942        call __main
    40         call main
     43
    4144        call __exit
  • uspace/lib/libc/arch/arm32/src/entry.s

    rb7f9087 rc98e6ee  
    3535## User-space task entry point
    3636#
     37# r1 contains the PCB pointer
    3738#
    3839__entry:
     40        # Pass pcb_ptr to __main as the first argument (in r0)
     41        mov r0, r1
    3942        bl __main
    40         bl main
     43
    4144        bl __exit
  • uspace/lib/libc/arch/ia32/src/entry.s

    rb7f9087 rc98e6ee  
    3535## User-space task entry point
    3636#
     37# %ebx contains the PCB pointer
    3738#
    3839__entry:
     
    4243        mov %ax, %fs
    4344        # Do not set %gs, it contains descriptor that can see TLS
    44        
     45
     46        # Pass the PCB pointer to __main as the first argument
     47        pushl %ebx
    4548        call __main
    46         call main
     49
    4750        call __exit
  • uspace/lib/libc/arch/ia64/src/entry.s

    rb7f9087 rc98e6ee  
    3535## User-space task entry point
    3636#
     37# r2 contains the PCB pointer
    3738#
    3839__entry:
    3940        alloc loc0 = ar.pfs, 0, 1, 2, 0
    40         mov r1 = _gp
     41        mov r1 = _gp
     42
     43        # Pass PCB pointer as the first argument to __main
     44        mov out0 = r2
    4145        br.call.sptk.many b0 = __main
    42460:
    43         br.call.sptk.many b0 = main
    44 1:
    4547        br.call.sptk.many b0 = __exit
  • uspace/lib/libc/arch/mips32/src/entry.s

    rb7f9087 rc98e6ee  
    3636## User-space task entry point
    3737#
     38# $a0 ($4) contains the PCB pointer
    3839#
    3940.ent __entry
     
    4142        .frame $sp, 32, $31
    4243        .cpload $25
    43        
    44        
     44
    4545        # Mips o32 may store its arguments on stack, make space (16 bytes),
    4646        # so that it could work with -O0
     
    4949        addiu $sp, -32
    5050        .cprestore 16   # Allow PIC code
    51        
     51
     52        # Pass pcb_ptr to __main() as the first argument. pcb_ptr is already
     53        # in $a0. As the first argument is passed in $a0, no operation
     54        # is needed.
     55
    5256        jal __main
    53         nop
    54        
    55         jal main
    5657        nop
    5758       
  • uspace/lib/libc/arch/ppc32/src/entry.s

    rb7f9087 rc98e6ee  
    3535## User-space task entry point
    3636#
     37# r3 contains the PCB pointer
    3738#
    3839__entry:
     40        # Pass the PCB pointer to __main() as the first argument.
     41        # Since the first argument is passed in r3, no operation is needed.
    3942        bl __main
    40         bl main
     43
    4144        bl __exit
  • uspace/lib/libc/arch/ppc64/src/entry.s

    rb7f9087 rc98e6ee  
    3232
    3333.globl __entry
    34 .globl __entry_driver
    3534
    3635## User-space task entry point
     
    3938__entry:
    4039        bl __main
    41         bl __io_init
    42         bl main
    4340        bl __exit
    44 
    45 __entry_driver:
    46         bl __main
    47         bl main
    48         bl __exit
  • uspace/lib/libc/arch/sparc64/src/entry.s

    rb7f9087 rc98e6ee  
    3535## User-space task entry point
    3636#
     37# %o0 contains uarg
     38# %o1 contains pcb_ptr
    3739#
    3840__entry:
     41        # Pass pcb_ptr as the first argument to __main()
     42        mov %o1, %o0
    3943        sethi %hi(_gp), %l7
    4044        call __main
    4145        or %l7, %lo(_gp), %l7
    42         call main
    43         nop
     46
    4447        call __exit
    4548        nop
  • uspace/lib/libc/generic/as.c

    rb7f9087 rc98e6ee  
    8484{
    8585        return __SYSCALL1(SYS_AS_AREA_DESTROY, (sysarg_t ) address);
     86}
     87
     88/** Change address-space area flags.
     89 *
     90 * @param address Virtual address pointing into the address space area being
     91 *      modified.
     92 * @param flags New flags describing type of the area.
     93 *
     94 * @return Zero on success or a code from @ref errno.h on failure.
     95 */
     96int as_area_change_flags(void *address, int flags)
     97{
     98        return __SYSCALL2(SYS_AS_AREA_CHANGE_FLAGS, (sysarg_t) address,
     99            (sysarg_t) flags);
    86100}
    87101
  • uspace/lib/libc/generic/io/stream.c

    rb7f9087 rc98e6ee  
    9797}
    9898
     99void close_console(void)
     100{
     101        if (console_phone >= 0) {
     102                if (ipc_hangup(console_phone) == 0) {
     103                        console_phone = -1;
     104                }
     105        }
     106}
     107
    99108void klog_update(void)
    100109{
  • uspace/lib/libc/generic/libc.c

    rb7f9087 rc98e6ee  
    4949#include <async.h>
    5050#include <as.h>
     51#include <loader/pcb.h>
    5152
    5253extern char _heap;
     54extern int main(int argc, char *argv[]);
    5355
    5456void _exit(int status)
     
    5759}
    5860
    59 void __main(void)
     61void __main(void *pcb_ptr)
    6062{
    6163        fibril_t *f;
     64        int argc;
     65        char **argv;
    6266
    6367        (void) as_area_create(&_heap, 1, AS_AREA_WRITE | AS_AREA_READ);
     
    6771       
    6872        open_console();
     73
     74        /* Save the PCB pointer */
     75        __pcb = (pcb_t *)pcb_ptr;
     76
     77        if (__pcb == NULL) {
     78                argc = 0;
     79                argv = NULL;
     80        } else {
     81                argc = __pcb->argc;
     82                argv = __pcb->argv;
     83        }
     84
     85        main(argc, argv);
    6986}
    7087
  • uspace/lib/libc/generic/task.c

    rb7f9087 rc98e6ee  
    11/*
    22 * Copyright (c) 2006 Jakub Jermar
     3 * Copyright (c) 2008 Jiri Svoboda
    34 * All rights reserved.
    45 *
     
    3435
    3536#include <task.h>
     37#include <ipc/ipc.h>
     38#include <ipc/loader.h>
    3639#include <libc.h>
     40#include <string.h>
     41#include <stdlib.h>
     42#include <async.h>
     43#include <errno.h>
    3744
    3845task_id_t task_get_id(void)
     
    4552}
    4653
    47 int task_spawn(void *image, size_t size)
     54static int task_spawn_loader(void)
    4855{
    49         return __SYSCALL2(SYS_TASK_SPAWN, (sysarg_t) image, (sysarg_t) size);
     56        int phone_id, rc;
     57
     58        rc = __SYSCALL1(SYS_PROGRAM_SPAWN_LOADER, (sysarg_t) &phone_id);
     59        if (rc != 0)
     60                return rc;
     61
     62        return phone_id;
     63}
     64
     65static int loader_set_args(int phone_id, const char *argv[])
     66{
     67        aid_t req;
     68        ipc_call_t answer;
     69        ipcarg_t rc;
     70
     71        const char **ap;
     72        char *dp;
     73        char *arg_buf;
     74        size_t buffer_size;
     75        size_t len;
     76
     77        /*
     78         * Serialize the arguments into a single array. First
     79         * compute size of the buffer needed.
     80         */
     81        ap = argv;
     82        buffer_size = 0;
     83        while (*ap != NULL) {
     84                buffer_size += strlen(*ap) + 1;
     85                ++ap;
     86        }
     87
     88        arg_buf = malloc(buffer_size);
     89        if (arg_buf == NULL) return ENOMEM;
     90
     91        /* Now fill the buffer with null-terminated argument strings */
     92        ap = argv;
     93        dp = arg_buf;
     94        while (*ap != NULL) {
     95                strcpy(dp, *ap);
     96                dp += strlen(*ap) + 1;
     97
     98                ++ap;
     99        }
     100
     101        /* Send serialized arguments to the loader */
     102
     103        req = async_send_0(phone_id, LOADER_SET_ARGS, &answer);
     104        rc = ipc_data_write_start(phone_id, (void *)arg_buf, buffer_size);
     105        if (rc != EOK) {
     106                async_wait_for(req, NULL);
     107                return rc;
     108        }
     109
     110        async_wait_for(req, &rc);
     111        if (rc != EOK) return rc;
     112
     113        /* Free temporary buffer */
     114        free(arg_buf);
     115
     116        return EOK;
     117}
     118
     119/** Create a new task by running an executable from VFS.
     120 *
     121 * @param path  pathname of the binary to execute
     122 * @param argv  command-line arguments
     123 * @return      ID of the newly created task or zero on error.
     124 */
     125task_id_t task_spawn(const char *path, const char *argv[])
     126{
     127        int phone_id;
     128        ipc_call_t answer;
     129        aid_t req;
     130        int rc;
     131        ipcarg_t retval;
     132
     133        /* Spawn a program loader */   
     134        phone_id = task_spawn_loader();
     135        if (phone_id < 0) return 0;
     136
     137        /*
     138         * Say hello so that the loader knows the incoming connection's
     139         * phone hash.
     140         */
     141        rc = async_req_0_0(phone_id, LOADER_HELLO);
     142        if (rc != EOK) return 0;
     143
     144        /* Send program pathname */
     145        req = async_send_0(phone_id, LOADER_SET_PATHNAME, &answer);
     146        rc = ipc_data_write_start(phone_id, (void *)path, strlen(path));
     147        if (rc != EOK) {
     148                async_wait_for(req, NULL);
     149                return 1;
     150        }
     151
     152        async_wait_for(req, &retval);
     153        if (retval != EOK) goto error;
     154
     155        /* Send arguments */
     156        rc = loader_set_args(phone_id, argv);
     157        if (rc != EOK) goto error;
     158
     159        /* Request loader to start the program */       
     160        rc = async_req_0_0(phone_id, LOADER_RUN);
     161        if (rc != EOK) goto error;
     162
     163        /* Success */
     164        ipc_hangup(phone_id);
     165        return 1;
     166
     167        /* Error exit */
     168error:
     169        ipc_hangup(phone_id);
     170        return 0;
    50171}
    51172
  • uspace/lib/libc/include/as.h

    rb7f9087 rc98e6ee  
    4343extern void *as_area_create(void *address, size_t size, int flags);
    4444extern int as_area_resize(void *address, size_t size, int flags);
     45extern int as_area_change_flags(void *address, int flags);
    4546extern int as_area_destroy(void *address);
    4647extern void *set_maxheapsize(size_t mhs);
  • uspace/lib/libc/include/io/stream.h

    rb7f9087 rc98e6ee  
    4141
    4242extern void open_console(void);
     43extern void close_console(void);
    4344extern void klog_update(void);
    4445
  • uspace/lib/libc/include/libc.h

    rb7f9087 rc98e6ee  
    4949    __syscall(p1, p2, p3, p4, p5, p6,id)
    5050
    51 extern void __main(void);
     51extern void __main(void *pcb_ptr);
    5252extern void __exit(void);
    5353
  • uspace/lib/libc/include/task.h

    rb7f9087 rc98e6ee  
    4141
    4242extern task_id_t task_get_id(void);
    43 extern int task_spawn(void *image, size_t size);
     43extern task_id_t task_spawn(const char *path, const char *argv[]);
    4444
    4545#endif
Note: See TracChangeset for help on using the changeset viewer.