From 453beb04ad4e19c7f6620229d8dee64d470860d1 Mon Sep 17 00:00:00 2001 From: Jorrit Herder Date: Fri, 10 Mar 2006 16:16:21 +0000 Subject: [PATCH] Library progress --- lib/i386/rts/Makefile.in | 1 + lib/i386/rts/_ipc.s | 32 ++--------------- lib/i386/rts/_ipcnew.s | 75 ++++++++++++++++++++++++++++++++++++++++ lib/other/Makefile.in | 1 + lib/other/_getsigset.c | 15 ++++++++ lib/syscall/Makefile.in | 1 + 6 files changed, 96 insertions(+), 29 deletions(-) create mode 100755 lib/i386/rts/_ipcnew.s create mode 100644 lib/other/_getsigset.c diff --git a/lib/i386/rts/Makefile.in b/lib/i386/rts/Makefile.in index 979dc8faa..fbe62872c 100644 --- a/lib/i386/rts/Makefile.in +++ b/lib/i386/rts/Makefile.in @@ -7,6 +7,7 @@ LIBRARIES=libc libc_FILES=" \ __sigreturn.s \ _ipc.s \ + _ipcnew.s \ brksize.s" STARTFILES="\ diff --git a/lib/i386/rts/_ipc.s b/lib/i386/rts/_ipc.s index 4d9191a08..80a32bcd9 100755 --- a/lib/i386/rts/_ipc.s +++ b/lib/i386/rts/_ipc.s @@ -1,5 +1,5 @@ .sect .text; .sect .rom; .sect .data; .sect .bss -.define __echo, __notify, __send, __nb_send, __receive, __nb_receive, __sendrec +.define __echo, __notify, __send, __receive, __sendrec ! See src/kernel/ipc.h for C definitions SEND = 1 @@ -7,19 +7,17 @@ RECEIVE = 2 SENDREC = 3 NOTIFY = 4 ECHO = 8 -NB_SEND = 1 + 16 ! flags 0x10 to prevent blocking -NB_RECEIVE = 2 + 16 ! flags 0x10 to prevent blocking SYSVEC = 33 ! trap to kernel SRC_DST = 8 ! source/ destination process -ECHO_MESS = 8 ! doesn't have SRC_DST +ECHO_MESS = 8 ! echo doesn't have SRC_DST MESSAGE = 12 ! message pointer !*========================================================================* ! IPC assembly routines * !*========================================================================* ! all message passing routines save ebp, but destroy eax and ecx. -.define __echo, __notify, __send, __nb_send, __receive, __nb_receive, __sendrec +.define __echo, __notify, __send, __receive, __sendrec .sect .text __send: push ebp @@ -33,18 +31,6 @@ __send: pop ebp ret -__nb_send: - push ebp - mov ebp, esp - push ebx - mov eax, SRC_DST(ebp) ! eax = dest-src - mov ebx, MESSAGE(ebp) ! ebx = message pointer - mov ecx, NB_SEND ! _nb_send(dest, ptr) - int SYSVEC ! trap to the kernel - pop ebx - pop ebp - ret - __receive: push ebp mov ebp, esp @@ -57,18 +43,6 @@ __receive: pop ebp ret -__nb_receive: - push ebp - mov ebp, esp - push ebx - mov eax, SRC_DST(ebp) ! eax = dest-src - mov ebx, MESSAGE(ebp) ! ebx = message pointer - mov ecx, NB_RECEIVE ! _nb_receive(src, ptr) - int SYSVEC ! trap to the kernel - pop ebx - pop ebp - ret - __sendrec: push ebp mov ebp, esp diff --git a/lib/i386/rts/_ipcnew.s b/lib/i386/rts/_ipcnew.s new file mode 100755 index 000000000..33d89a4db --- /dev/null +++ b/lib/i386/rts/_ipcnew.s @@ -0,0 +1,75 @@ +.sect .text; .sect .rom; .sect .data; .sect .bss +.define __ipc_request, __ipc_reply, __ipc_notify, __ipc_receive + +! See src/kernel/ipc.h for C definitions. +IPC_REQUEST = 16 ! each gets a distinct bit +IPC_REPLY = 32 +IPC_NOTIFY = 64 +IPC_RECEIVE = 128 + +SYSVEC = 33 ! trap to kernel + +! Offsets of arguments relative to stack pointer. +SRC_DST = 8 ! source/ destination process +SEND_MSG = 12 ! message pointer for sending +EVENT_SET = 12 ! notification event set +RECV_MSG = 16 ! message pointer for receiving + + +!*========================================================================* +! IPC assembly routines * +!*========================================================================* +! all message passing routines save ebp, but destroy eax, ecx, and edx. +.define __ipc_request, __ipc_reply, __ipc_notify, __ipc_receive +.sect .text + +__ipc_request: + push ebp + mov ebp, esp + push ebx + mov eax, SRC_DST(ebp) ! eax = destination + mov ebx, SEND_MSG(ebp) ! ebx = message pointer + mov ecx, IPC_REQUEST ! _ipc_request(dst, ptr) + int SYSVEC ! trap to the kernel + pop ebx + pop ebp + ret + +__ipc_reply: + push ebp + mov ebp, esp + push ebx + mov eax, SRC_DST(ebp) ! eax = destination + mov ebx, SEND_MSG(ebp) ! ebx = message pointer + mov ecx, IPC_REPLY ! _ipc_reply(dst, ptr) + int SYSVEC ! trap to the kernel + pop ebx + pop ebp + ret + +__ipc_receive: + push ebp + mov ebp, esp + push ebx + mov eax, SRC_DST(ebp) ! eax = source + mov edx, EVENT_SET(ebp) ! ebx = event set + mov ebx, RCV_MSG(ebp) ! ebx = message pointer + mov ecx, IPC_RECEIVE ! _ipc_receive(src, events, ptr) + int SYSVEC ! trap to the kernel + pop ebx + pop ebp + ret + +__ipc_notify: + push ebp + mov ebp, esp + push ebx + mov eax, SRC_DST(ebp) ! ebx = destination + mov edx, EVENT_SET(ebp) ! edx = event set + mov ecx, IPC_NOTIFY ! _ipc_notify(dst, events) + int SYSVEC ! trap to the kernel + pop ebx + pop ebp + ret + + diff --git a/lib/other/Makefile.in b/lib/other/Makefile.in index 5839c361e..2fbc0467b 100644 --- a/lib/other/Makefile.in +++ b/lib/other/Makefile.in @@ -11,6 +11,7 @@ libc_FILES=" \ _findproc.c \ _freemem.c \ _getnpid.c \ + _getsigset.c \ _getnprocnr.c \ _getpprocnr.c \ _getprocnr.c \ diff --git a/lib/other/_getsigset.c b/lib/other/_getsigset.c new file mode 100644 index 000000000..74db36a6f --- /dev/null +++ b/lib/other/_getsigset.c @@ -0,0 +1,15 @@ +#include +#define getsigset _getsigset +#include + + +PUBLIC int getsigset(sp) +sigset_t *sp; /* where to put it */ +{ + message m; + m.m2_i1 = SELF; /* request own signal set */ + if (_syscall(PM_PROC_NR, PROCSTAT, &m) < 0) return(-1); + *sp = m.m2_l1; + return(0); +} + diff --git a/lib/syscall/Makefile.in b/lib/syscall/Makefile.in index ad9de23f2..932c6f5f9 100644 --- a/lib/syscall/Makefile.in +++ b/lib/syscall/Makefile.in @@ -47,6 +47,7 @@ libc_FILES=" \ getppid.s \ getpprocnr.s \ getprocnr.s \ + getsigset.s \ getsysinfo.s \ getuid.s \ ioctl.s \ -- 2.44.0