#include <stdio.h>
#include <stdlib.h>
#include <ipc/ipc.h>
#include <syscall.h>
#include <libc.h>
#include <console.h>
#include <ipc/services.h>
static void kputint(unsigned i)
{
unsigned dummy;
asm volatile (
"movl $30, %%eax;"
"int $0x30"
: "=d" (dummy) /* output - %edx clobbered */
: "d" (i) /* input */
: "%eax","%ecx" /* all scratch registers clobbered */
);
}
int
ipc_call_sync_fast(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2,
ipcarg_t arg3, ipcarg_t *result1, ipcarg_t *result2, ipcarg_t *result3,
ipcarg_t *result4, ipcarg_t *result5)
{
ipc_call_t resdata;
int callres;
callres = __SYSCALL6(SYS_IPC_CALL_SYNC_FAST, phoneid, method, arg1,
arg2, arg3, (sysarg_t) &resdata);
if (callres)
return callres;
if (result1)
*result1 = IPC_GET_ARG1(resdata);
if (result2)
*result2 = IPC_GET_ARG2(resdata);
if (result3)
*result3 = IPC_GET_ARG3(resdata);
if (result4)
*result4 = IPC_GET_ARG4(resdata);
if (result5)
*result5 = IPC_GET_ARG5(resdata);
return IPC_GET_RETVAL(resdata);
}
int ipc_connect_me_to(int phoneid, int arg1, int arg2, int arg3)
{
ipcarg_t newphid;
int res;
res = ipc_call_sync_3_5(phoneid, IPC_M_CONNECT_ME_TO, arg1, arg2, arg3,
NULL, NULL, NULL, NULL, &newphid);
if (res)
return res;
return newphid;
}
static int console_phone = -1;
ssize_t write_stderr(const void *buf, size_t count)
{
return count;
}
ssize_t read_stdin(void *buf, size_t count)
{
ipcarg_t r0, r1;
size_t i = 0;
while (i < count) {
if (ipc_call_sync_0_2(console_phone, CONSOLE_GETCHAR, &r0,
&r1) < 0) {
return -1;
}
((char *) buf)[i++] = r0;
}
return i;
}
ssize_t write_stdout(const void *buf, size_t count)
{
int i;
for (i = 0; i < count; i++)
ipc_call_sync_1_0(console_phone, CONSOLE_PUTCHAR,
((const char *) buf)[i]);
return count;
}
void open_stdin(void)
{
kputint(0x1234);
if (console_phone < 0) {
while ((console_phone = ipc_connect_me_to(PHONE_NS,
SERVICE_CONSOLE, 0, 0)) < 0) {
//usleep(10000);
}
kputint(console_phone);
}
}
void open_stdout(void)
{
kputint(0x1235);
if (console_phone < 0) {
while ((console_phone = ipc_connect_me_to(PHONE_NS,
SERVICE_CONSOLE, 0, 0)) < 0) {
//usleep(10000);
}
kputint(console_phone);
}
}
int get_cons_phone(void)
{
return console_phone;
}
void __main(void)
{
kputint(0x110);
}
void __io_init(void)
{
open_stdin();
open_stdout();
}
void __exit(void)
{
kputint(0x112);
}
{
unsigned char ch = c;
if (write_stdout((void *) &ch, 1) == 1)
return c;
return EOF;
}
{
unsigned char c;
if (read_stdin((void *) &c, 1) == 1)
return c;
return EOF;
}
int printf(const char *fmt
, ...
)
{
while (*fmt) {
}
return 0;
}