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;
- }
|