| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 | /* -*- mode:c; c-file-style:"k&r"; c-basic-offset: 4; tab-width:4; indent-tabs-mode:nil; mode:auto-fill; fill-column:78; -*- *//* vim: set ts=4 sw=4 et tw=78 fo=cqt wm=0: *//* This Hello World simply print out "Hello World" */#include "pal.h"#include "pal_debug.h"struct stack_frame {     struct stack_frame* next;     void* ret;};PAL_HANDLE _fork (void * args){    register struct stack_frame * fp __asm__ ("ebp");    struct stack_frame * frame = fp;    if (args == NULL) {        struct stack_frame cur_frame = *frame;        pal_printf("return address is %p\n", cur_frame.ret);        return DkThreadCreate(&_fork, &cur_frame);    }    else {        struct stack_frame * las_frame = (struct stack_frame *) args;        pal_printf("(in child) return address is %p\n", las_frame->ret);        return NULL;    }}int main (int argc, char ** argv){    pal_printf("Enter Main Thread\n");    PAL_HANDLE out = DkStreamOpen("dev:tty", PAL_ACCESS_WRONLY, 0, 0, 0);    if (out == NULL) {        pal_printf("DkStreamOpen failed\n");        return -1;    }    void * param = NULL;    PAL_HANDLE child = _fork(param);    if (child == NULL) {        pal_printf("in the child\n");        char *str = (void *) DkVirtualMemoryAlloc(NULL, 20, 0,                                                  PAL_PROT_READ|PAL_PROT_WRITE);        if (str == NULL) {            pal_printf("DkVirtualMemoryAlloc failed\n");            return -1;        }        str[0] = 'H';        str[1] = 'e';        str[2] = 'l';        str[3] = 'l';        str[4] = 'o';        str[5] = ' ';        str[6] = 'W';        str[7] = 'o';        str[8] = 'r';        str[9] = 'l';        str[10] = 'd';        str[11] = '\n';        str[12] = 0;        int bytes = DkStreamWrite(out, 0, 12, str, NULL);        if (bytes < 0) {            pal_printf("DkStreamWrite failed\n");            return -1;        }        DkVirtualMemoryFree(str, 20);        DkThreadExit();    }    else {        pal_printf("in the parent\n");        DkThreadDelayExecution(3000);    }    DkObjectClose(out);    pal_printf("Leave Main Thread\n");    return 0;}
 |