From e42395e42a35f8d524c00b540d2a3e9b71bca765 Mon Sep 17 00:00:00 2001 From: Taku Shimosawa Date: Fri, 2 Dec 2011 13:19:44 +0900 Subject: [PATCH] valid flag is added --- kernel/include/syscall.h | 3 ++- kernel/syscall.c | 2 ++ linux/include/uprotocol.h | 3 ++- linux/mod_mcctrl/ikc.c | 14 ++++++++++++-- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/kernel/include/syscall.h b/kernel/include/syscall.h index fd920ebb..1b4f2c2c 100644 --- a/kernel/include/syscall.h +++ b/kernel/include/syscall.h @@ -50,8 +50,9 @@ struct ikc_scd_init_param { }; struct syscall_request { + unsigned long valid; unsigned long number; - unsigned long args[5]; + unsigned long args[6]; }; struct syscall_response { diff --git a/kernel/syscall.c b/kernel/syscall.c index a92804ef..c4ddcd71 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -29,6 +29,7 @@ static void send_syscall(struct syscall_request *req) memcpy_async_wait(&fin); + cpu_local_var(scp).request_va->valid = 1; *(unsigned int *)cpu_local_var(scp).doorbell_va = 1; #ifdef SYSCALL_BY_IKC @@ -68,6 +69,7 @@ long sys_brk(int n, aal_mc_user_context_t *ctx) #define SYSCALL_DECLARE(name) long sys_##name(int n, aal_mc_user_context_t *ctx) #define SYSCALL_HEADER struct syscall_request request; \ + request.valid = 0; \ request.number = n #define SYSCALL_ARG_D(n) request.args[n] = aal_mc_syscall_arg##n(ctx) #define SYSCALL_ARG_MO(n) \ diff --git a/linux/include/uprotocol.h b/linux/include/uprotocol.h index e5bc8bcf..aa9a8451 100644 --- a/linux/include/uprotocol.h +++ b/linux/include/uprotocol.h @@ -35,8 +35,9 @@ struct program_load_desc { }; struct syscall_request { + unsigned long valid; unsigned long number; - unsigned long args[5]; + unsigned long args[6]; }; struct syscall_wait_desc { diff --git a/linux/mod_mcctrl/ikc.c b/linux/mod_mcctrl/ikc.c index dedbd1d4..2029c6be 100644 --- a/linux/mod_mcctrl/ikc.c +++ b/linux/mod_mcctrl/ikc.c @@ -54,6 +54,9 @@ int mcctrl_ikc_set_recv_cpu(int cpu) return 0; } +unsigned long *mcctrl_doorbell_va; +unsigned long mcctrl_doorbell_pa; + static void mcctrl_ikc_init(aal_os_t os, int cpu, unsigned long rphys) { struct ikc_scd_packet packet; @@ -71,8 +74,8 @@ static void mcctrl_ikc_init(aal_os_t os, int cpu, unsigned long rphys) pmc->param.request_va = (void *)__get_free_pages(GFP_KERNEL, 4); pmc->param.request_pa = virt_to_phys(pmc->param.request_va); - pmc->param.doorbell_va = (void *)__get_free_page(GFP_KERNEL); - pmc->param.doorbell_pa = virt_to_phys(pmc->param.doorbell_va); + pmc->param.doorbell_va = mcctrl_doorbell_va; + pmc->param.doorbell_pa = mcctrl_doorbell_pa; pmc->param.post_va = (void *)__get_free_page(GFP_KERNEL); pmc->param.post_pa = virt_to_phys(pmc->param.post_va); memset(pmc->param.doorbell_va, 0, PAGE_SIZE); @@ -97,6 +100,10 @@ static void mcctrl_ikc_init(aal_os_t os, int cpu, unsigned long rphys) packet.ref = cpu; packet.arg = rphys; + printk("Request: %lx, Response: %lx, Doorbell: %lx\n", + pmc->param.request_pa, pmc->param.response_rpa, + pmc->param.doorbell_pa); + aal_ikc_send(pmc->c, &packet, 0); iounmap(rpm); @@ -138,6 +145,9 @@ int prepare_ikc_channels(aal_os_t os) { struct aal_cpu_info *info; + mcctrl_doorbell_va = (void *)__get_free_page(GFP_KERNEL); + mcctrl_doorbell_pa = virt_to_phys(mcctrl_doorbell_va); + info = aal_os_get_cpu_info(os); if (!info) { printk("Error: cannot retrieve CPU info.\n");