/* * Micro RTX bindings for the gnu C compiler * * ++jrb bammi@dsrgsun.ces.cwru.edu * * preprocessor symbols: * __NO_INLINE__ if #define'd do not generate inline traps. use * functional form of bindings in grtxbind.c (32 bit) * or srtxtraps.s (16 bit default ints). * you'll need to #define this when using some * debuggers, that otherwise get confused by * inline traps. * * __MSHORT__ automatically defined when compiling with 16 * bit integer defaults for `int'. automatically * undefined when compiling for 32 bit ints. * */ #ifndef _RTXBIND_H #define _RTXBIND_H #include #include #if ((defined(__GNUC__)) && (!defined(__NO_INLINE__))) /* * GNU C (pseudo inline) Statement Exprs for traps * note: use of statement expr instead of inline routines * due to brain damage in gcc 1.36. * * to see the actual rtxbindings search for the string 'data struct' * forward in this file */ #define _trap5_w(n) \ ({ \ long retvalue; \ \ __asm__ volatile \ ("\ movw %1,sp@-; \ trap #5; \ addqw #2,sp; \ movl d0,%0" \ : "=g"(retvalue) /* outputs */ \ : "r"(n) /* inputs */ \ : "d0", "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ ); \ retvalue; \ }) #define _trap5_wl(n, l1) \ ({ \ long retvalue; \ \ __asm__ volatile \ ("\ movl %2,sp@-; \ movw %1,sp@-; \ trap #5; \ addqw #6,sp; \ movl d0,%0" \ : "=g"(retvalue) /* outputs */ \ : "r"(n), "r"(l1) /* inputs */ \ : "d0", "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ ); \ retvalue; \ }) #define _trap5_wlw(n, l1, w1) \ ({ \ long retvalue; \ \ __asm__ volatile \ ("\ movw %3,sp@-; \ movl %2,sp@-; \ movw %1,sp@-; \ trap #5; \ addqw #8,sp; \ movl d0,%0" \ : "=g"(retvalue) /* outputs */ \ : "r"(n), "r"(l1), "r"(w1) /* inputs */ \ : "d0", "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ ); \ retvalue; \ }) #define _trap5_wlwl(n, l1, w1, l2) \ ({ \ long retvalue; \ \ __asm__ volatile \ ("\ movl %4,sp@-; \ movw %3,sp@-; \ movl %2,sp@-; \ movw %1,sp@-; \ trap #5; \ lea sp@(12),sp; \ movl d0,%0" \ : "=g"(retvalue) /* outputs */ \ : "r"(n), "r"(l1), "r"(w1), "r"(l2) /* inputs */ \ : "d0", "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ ); \ retvalue; \ }) #define _trap5_wll(n, l1, l2) \ ({ \ long retvalue; \ \ __asm__ volatile \ ("\ movl %3,sp@-; \ movl %2,sp@-; \ movw %1,sp@-; \ trap #5; \ lea sp@(10),sp; \ movl d0,%0" \ : "=g"(retvalue) /* outputs */ \ : "r"(n), "r"(l1), "r"(l2) /* inputs */ \ : "d0", "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ ); \ retvalue; \ }) #define _trap5_wlll(n, l1, l2, l3) \ ({ \ long retvalue; \ \ __asm__ volatile \ ("\ movl %4,sp@-; \ movl %3,sp@-; \ movl %2,sp@-; \ movw %1,sp@-; \ trap #5; \ lea sp@(14),sp; \ movl d0,%0" \ : "=g"(retvalue) /* outputs */ \ : "r"(n), "r"(l1), "r"(l2), "r"(l3) /* inputs */ \ : "d0", "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ ); \ retvalue; \ }) #define _trap5_wwl(n, w1, l1) \ ({ \ long retvalue; \ \ __asm__ volatile \ ("\ movl %3,sp@-; \ movw %2,sp@-; \ movw %1,sp@-; \ trap #5; \ addqw #8,sp; \ movl d0,%0" \ : "=g"(retvalue) /* outputs */ \ : "r"(n), "r"(w1), "r"(l1) /* inputs */ \ : "d0", "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ ); \ retvalue; \ }) #define _trap5_wllwl(n, l1, l2, w1, l3) \ ({ \ long retvalue; \ \ __asm__ volatile \ ("\ movl %4,sp@-; \ movw %3,sp@-; \ movl %2,sp@-; \ movl %1,sp@-; \ movw %0,sp@-" \ : /* outputs */ \ : "r"(n), "r"(l1), "r"(l2), "r"(w1), "r"(l3) /* inputs */ \ ); \ __asm__ volatile \ ("\ trap #5; \ lea sp@(16),sp; \ movl d0,%0" \ : "=g"(retvalue) /* outputs */ \ : /* inputs */ \ : "d0", "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ ); \ retvalue; \ }) #define _trap5_wlwwlwll(n, l1, w1, w2, l2, w3, l3, l4) \ ({ \ long retvalue; \ \ __asm__ volatile \ ("\ movl %4,sp@-; \ movl %3,sp@-; \ movw %2,sp@-; \ movl %1,sp@-; \ movw %0,sp@-" \ : /* outputs */ \ : "r"(w2), "r"(l2), "r"(w3), "r"(l3), "r"(l4) /* inputs */ \ ); \ __asm__ volatile \ ("\ movw %3,sp@-; \ movl %2,sp@-; \ movw %1,sp@-; \ trap #5; \ lea sp@(24),sp; \ movl d0,%0" \ : "=g"(retvalue) /* outputs */ \ : "r"(n), "r"(l1), "r"(w1) /* inputs */ \ : "d0", "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ ); \ retvalue; \ }) #define _trap5_wwllllll(n, w1, l1, l2, l3, l4, l5, l6) \ ({ \ long retvalue; \ \ __asm__ volatile \ ("\ movl %4,sp@-; \ movl %3,sp@-; \ movl %2,sp@-; \ movl %1,sp@-; \ movl %0,sp@-" \ : /* outputs */ \ : "r"(l2), "r"(l3), "r"(l4), "r"(l5), "r"(l6) /* inputs */ \ ); \ __asm__ volatile \ ("\ movl %3,sp@-; \ movw %2,sp@-; \ movw %1,sp@-; \ trap #5; \ lea sp@(28),sp; \ movl d0,%0" \ : "=g"(retvalue) /* outputs */ \ : "r"(n), "r"(w1), "r"(l1) /* inputs */ \ : "d0", "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ ); \ retvalue; \ }) /* * additional gemdos bindings (not in ) */ #define trap_1_wwwll(n, w1, w2, l1, l2) \ ({ \ long retvalue; \ \ __asm__ volatile \ ("\ movl %4,sp@-; \ movl %3,sp@-; \ movw %2,sp@-; \ movw %1,sp@-; \ movw %0,sp@- " \ : /* outputs */ \ : "r"(n), "r"(w1), "r"(w2), "r"(l1), "r"(l2) /* inputs */ \ ); \ /* no more than 5 operand allowed in asm() -- therefore the split */ \ \ __asm__ volatile \ ("\ trap #1; \ lea sp@(14),sp; \ movl d0,%0" \ : "=g"(retvalue) /* outputs */ \ : /* inputs */ \ : "d0", "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ ); \ retvalue; \ }) #else /* __GNUC__ && !__NO_INLINE__ */ /* if inlines are not allowed, then declare things external */ /* if __MSHORT__ is defined (16 bit integers) then use the "traditional" rtxbind. Otherwise, pick up the necessary stuff from the library(grtxbind.c), relying on the fact that the default return type (int) is 32 bits, hence big enough to hold return values. */ #ifdef __MSHORT__ extern long gemdos(), rtxbind(); #define _trap5_w rtxbind #define _trap5_wl rtxbind #define _trap5_wlw rtxbind #define _trap5_wlwl rtxbind #define _trap5_wll rtxbind #define _trap5_wlll rtxbind #define _trap5_wwl rtxbind #define _trap5_wllwl rtxbind #define _trap5_wlwwlwll rtxbind #define _trap5_wwllllll rtxbind #define trap_1_wwwll gemdos #else extern long _trap5_w(), _trap5_wl(), _trap5_wlw(), _trap5_wlwl(), _trap5_wll(), _trap5_wlll(), _trap5_wwl(), _trap5_wllwl(), _trap5_wlwwlwll(), _trap5_wwllllll(), trap_1_wwwll(); #endif /* __MSHORT__ */ #endif /* !__NO_INLINE__ */ /* * data structs */ typedef struct { BASEPAGE *basepage; /* gemdos basepage (extern BASEPAGE *_base) */ short max_proc; /* max processes */ short max_msgs; /* max system message buffers */ short max_queues; /* max message queue */ void (*create_call)(); /* process creation hook */ void (*delete_call)(); /* process delete hook */ void (*switch_call)(); /* process (re)schedule hook */ } CONFIG; typedef struct { /* RTX process status */ unsigned short unused1:10; unsigned short EWAIT:1; /* blocked for event */ unsigned short QWAIT:1; /* blocked for queue */ unsigned short PAUSED:1; /* blocked for timer */ unsigned short RUNNING:1; /* running */ unsigned short READY:1; /* ready to run */ unsigned short unused2:1; } PROCESS_STATE; typedef struct { /* RTX sgtty */ unsigned short unused1:7; unsigned short FD_RAWIO:1; unsigned short FD_NOECHO:1; unsigned short FD_CLOSED:1; unsigned short FD_PIPE:1; unsigned short FD_STD:1; unsigned short FD_WRITE:1; unsigned short FD_READ:1; unsigned short FD_FILE:1; unsigned short FD_TTY:1; } RTXTTY; #define rtx_install(conf) \ (char *)_trap5_wl((short)0x00, (CONFIG *)(conf)) #define p_create(name, priority, slice, load, arg_count, args, stack_size) \ (char *)_trap5_wlwwlwll((short)0x01, (char *)(name), (short)(priority), \ (short)(slice), (void(*)())(load), \ (short)(arg_count), (char *)(args), \ (long)(stack_size)) #define p_delete(pid) \ (short)_trap5_wl((short)0x02, (char *)(pid)) #define p_priority(pid, delta) \ (short)_trap5_wlw((short)0x03, (char *)pid, (short)(delta)) #define p_slice(pid, delta) \ (short)_trap5_wlw((short)0x04, (char *)(pid), (short)(delta)) #define q_create(name, mode) \ (char *)_trap5_wlw((short)0x05, (char *)(name), (short)(mode)) #define q_delete(qid) \ (short)_trap5_wl((short)0x06, (char *)(qid)) #define q_send(qid, msg) \ (short)_trap5_wll((short)0x07, (char *)(qid), (long *)(msg)) #define q_req(qid, msg, nowait_option, timeout) \ (short)_trap5_wllwl((short)0x08, (char *)(qid), (long *)(msg), \ (short)(nowait_option), (long)(timeout)) #define q_jam(qid, msg) \ (short)_trap5_wll((short)0x09, (char *)(qid), (long *)(msg)) #define e_signal(pid, event) \ (short)_trap5_wlw((short)0x0a, (char *)(pid), (short)(event)) #define e_wait(event, condition, timeout) \ (short)_trap5_wlwl((short)0x0b, (short *)(event), (short)(condition), \ (long)(timeout)) #define p_pause(msec) \ (short)_trap5_wl((short)0x0c, (long)(msec)) #define m_alloc(size) \ (void *)_trap5_wl((short)0x0d, (unsigned long)(size)) #define m_free(segment) \ (short)_trap5_wl((short)0x0e, (void *)(segment)) #define m_assign(segment, pid) \ (short)_trap5_wll((short)0x0f, (void *)(segment), (char *)(pid)) #define p_lookup(name) \ (char *)_trap5_wl((short)0x010, (char *)(name)) #define q_lookup(name) \ (char *)_trap5_wl((short)0x011, (char *)(name)) #define p_info(pid, state) \ (char *)_trap5_wll((short)0x012, (char *)(pid), (PROCESS_STATE *)(state)) #define p_vector(pid, vector) \ (void *)_trap5_wll((short)0x013, (char *)(pid), (void *)(vector)) #define p_suspend(pid) /* ret type in manual does'nt jive */ \ (short)_trap5_wl((short)0x014, (char *)(pid)) #define p_resume(pid) /* ret type in manual does'nt jive */ \ (short)_trap5_wl((short)0x015, (char *)(pid)) #define d_install(unit, name, constat, conin, conout, costat, cntrl) \ (short)_trap5_wwllllll((short)0x016, (short)(unit), (char *)(name), \ (void(*)())(constat), (void(*)())(conin), \ (void(*)())(conout), (void(*)())(costat), \ (void(*)())(cntrl)) #define d_cntrl(unit, parm) \ (short)_trap5_wwl((short)0x017, (short)(unit), (void *)(parm)) #define q_info(qid, proc_q, msg_q) \ (short)_trap5_wlll((short)0x018, (char *)(qid), (short *)(proc_q), \ (short *)(msg_q)) #define rtx_remove() \ (short)_trap5_w((short)0x0ff) #define Popen(fd) \ (short)trap_1_wl((short)0x100,(short *)(fd)) #define Ftype(handle) \ (short)trap_1_ww((short)(0x101),(short)(handle)) #define Flock(fd, flag, offset, length) \ (short)trap_1_wwwll((short)(0x102), (short)(fd), (short)(flag), \ (long)(offset), (long)(length)) #define Fcntrl(fd, mode) \ (RTXTTY)trap_1_www((short)(0x104), (short)(fd), (RTXTTY)(mode)) #define Psettpa(size) \ (long)trap_1_wl((short)(0x103),(long)(size)) #define Mquota(a) \ (long)trap_1_wl((short)(0x105), (long)(a)) /* is this correct?? */ #endif /* _RTXBIND_H */