Xinu Compatability Layer
Jump to navigation
Jump to search
Here is the full C source code for the Xinu Compatability Layer.
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <device.h>
#include <tty.h>
#include <memory.h>
#include <thread.h>
#include <monitor.h>
syscall _readint(void)
{
int i = 0, c = 0;
control(CONSOLE, TTY_CTRL_SET_IFLAG, TTY_ECHO, 0);
c = getchar();
while (('\n' != c) && ('\r' != c) && (EOF != c))
{
if (('0' <= c) && ('9' >= c))
{
i = i * 10 + c - '0';
}
c = getchar();
}
kprintf("\r\n");
if (EOF == c)
return c;
return i;
}
syscall _printint(int i)
{
return kprintf("%d\r\n", i);
}
syscall _print(char *s)
{
return kprintf("%s", s);
}
syscall _println(void)
{
return kprintf("\r\n");
}
syscall _yield(void)
{
return yield();
}
syscall _sleep(int time)
{
return sleep(time);
}
int * _new(int n, int init)
{
int size = (n + 2) * 4;
int *p = (int *)memget(size);
bzero(p, size);
p[0] = moncreate(1);
p[1] = init;
return p + 2;
}
syscall _lock(int * objAdder)
{
int * A = objAdder - 2;
monitor m = (monitor) *A;
return lock(m);
}
syscall _unlock(int * objAdder)
{
int * A = objAdder - 2;
monitor m = (monitor) *A;
return unlock(m);
}
syscall _threadCreate(int * threadObjAdder)
{
int * A = threadObjAdder - 1;
int * B = (int*) *A;
int * C = (int*) *B;
void * procadder = (void *) C;
return ready(create(procadder, INITSTK, INITPRIO, "MiniJavaThread", 1, threadObjAdder), RESCHED_NO);
}
void _BADPTR(void)
{
fprintf(CONSOLE, "FATAL ERROR: Null Pointer Exception!\n");
kill(thrcurrent);
}
void _BADSUB(void)
{
fprintf(CONSOLE, "FATAL ERROR: Index Out Of Bounds Exception!\n");
kill(thrcurrent);
}