1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- /* 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(/*clear_child_tid=*/NULL);
- } else {
- pal_printf("in the parent\n");
- DkThreadDelayExecution(3000);
- }
- DkObjectClose(out);
- pal_printf("Leave Main Thread\n");
- return 0;
- }
|