From bb4a9929071d36353ca47bf34a6b2726f6552335 Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Mon, 7 Jul 2014 19:13:43 +0200 Subject: [PATCH] runtime: implement RPC syscall --- soc/runtime/main.c | 93 +++++++++++++++++++++++++++++++++------------- 1 file changed, 67 insertions(+), 26 deletions(-) diff --git a/soc/runtime/main.c b/soc/runtime/main.c index c78402d86..f1f5697a0 100644 --- a/soc/runtime/main.c +++ b/soc/runtime/main.c @@ -11,24 +11,12 @@ #include "elf_loader.h" -static void receive_sync(void) -{ - char c; - int recognized; +enum { + MSGTYPE_KERNEL_FINISHED = 0x01, + MSGTYPE_RPC_REQUEST = 0x02, +}; - recognized = 0; - while(1) { - c = readchar(); - if(c == 0x5a) { - recognized++; - if(recognized == 4) - return; - } else - recognized = 0; - } -} - -static int receive_length(void) +static int receive_int(void) { unsigned int r; int i; @@ -36,11 +24,57 @@ static int receive_length(void) r = 0; for(i=0;i<4;i++) { r <<= 8; - r |= (unsigned char)readchar(); + r |= (unsigned char)uart_read(); } return r; } +static char receive_char(void) +{ + return uart_read(); +} + +static void send_int(int x) +{ + int i; + + for(i=0;i<4;i++) { + uart_write((x & 0xff000000) >> 24); + x <<= 8; + } +} + +static void send_sint(short int i) +{ + uart_write((i >> 8) & 0xff); + uart_write(i & 0xff); +} + +static void send_char(char c) +{ + uart_write(c); +} + +static void receive_sync(void) +{ + char c; + int recognized; + + recognized = 0; + while(recognized < 4) { + c = uart_read(); + if(c == 0x5a) + recognized++; + else + recognized = 0; + } +} + +static void send_sync(void) +{ + send_int(0x5a5a5a5a); +} + static int download_kernel(void *buffer, int maxlength) { int length; @@ -48,25 +82,29 @@ static int download_kernel(void *buffer, int maxlength) unsigned char *_buffer = buffer; receive_sync(); - length = receive_length(); + length = receive_int(); if(length > maxlength) return -1; for(i=0;i 0) { - load_elf(syscalls, kbuf, length, kcode, sizeof(kcode)); - flush_cpu_icache(); - k(); + if(load_elf(syscalls, kbuf, length, kcode, sizeof(kcode))) { + flush_cpu_icache(); + k(); + send_sync(); + send_char(MSGTYPE_KERNEL_FINISHED); + } } }