aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2024-08-22 00:08:46 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2024-08-22 00:08:46 +0300
commit4168cca8124acdbd1866eb87810efe1cfe16903c (patch)
tree311b99d22ee32a47753036d6385b19201cb7727e
parent6e1ccf81948c356130a0a9bf02cf0027a47b7361 (diff)
downloadkmi-4168cca8124acdbd1866eb87810efe1cfe16903c.tar.gz
kmi-4168cca8124acdbd1866eb87810efe1cfe16903c.zip
add basic ipc-req test
-rw-r--r--arch/riscv64/kernel/vmem.c2
-rw-r--r--include/kmi/tcb.h2
-rw-r--r--tests/common/test.h20
-rw-r--r--tests/ipc-req/check.mk4
-rw-r--r--tests/ipc-req/init.c36
-rw-r--r--tests/ipc-req/source.mk2
6 files changed, 54 insertions, 12 deletions
diff --git a/arch/riscv64/kernel/vmem.c b/arch/riscv64/kernel/vmem.c
index 9473f38..a4cf552 100644
--- a/arch/riscv64/kernel/vmem.c
+++ b/arch/riscv64/kernel/vmem.c
@@ -628,7 +628,7 @@ void mark_rpc_valid(struct tcb *t, vm_t bottom)
struct vmem *b = t->arch.rpc_leaf;
int bottom_idx = t->arch.rpc_idx;
int top_idx = (bottom - RPC_STACK_BASE) / BASE_PAGE_SIZE;
- assert(bottom_idx < top_idx);
+ assert(bottom_idx <= top_idx);
while (top_idx != bottom_idx) {
pm_t *pte = (pm_t *)&b->leaf[bottom_idx];
diff --git a/include/kmi/tcb.h b/include/kmi/tcb.h
index 4214cb0..a3f119b 100644
--- a/include/kmi/tcb.h
+++ b/include/kmi/tcb.h
@@ -36,7 +36,7 @@ struct tcb;
* @param t Thread to check.
* @return \c true if thread is in RPC, \c false otherwise.
*/
-#define is_rpc(t) (t->rid != t->pid)
+#define is_rpc(t) (!rpc_stack_empty(t->rpc_stack))
/**
* Get the effective process thread of current thread.
diff --git a/tests/common/test.h b/tests/common/test.h
index 40e3622..2738bcd 100644
--- a/tests/common/test.h
+++ b/tests/common/test.h
@@ -177,17 +177,17 @@ static inline id_t sys_req_abs_timer(uint64_t ticks)
#define sys_ipc_kick3(pid, d0, d1, d2) syscall4(SYS_IPC_KICK, pid, d0, d1, d2)
#define sys_ipc_kick4(pid, d0, d1, d2, d3) syscall5(SYS_IPC_KICK, pid, d0, d1, d2, d3)
-#define sys_ipc_resp0(pid) syscall1(SYS_IPC_RESP, pid)
-#define sys_ipc_resp1(pid, d0) syscall2(SYS_IPC_RESP, pid, d0)
-#define sys_ipc_resp2(pid, d0, d1) syscall3(SYS_IPC_RESP, pid, d0, d1)
-#define sys_ipc_resp3(pid, d0, d1, d2) syscall4(SYS_IPC_RESP, pid, d0, d1, d2)
-#define sys_ipc_resp4(pid, d0, d1, d2, d3) syscall5(SYS_IPC_RESP, pid, d0, d1, d2, d3)
+#define sys_ipc_resp0() syscall0(SYS_IPC_RESP)
+#define sys_ipc_resp1(d0) syscall1(SYS_IPC_RESP, d0)
+#define sys_ipc_resp2(d0, d1) syscall2(SYS_IPC_RESP, d0, d1)
+#define sys_ipc_resp3(d0, d1, d2) syscall3(SYS_IPC_RESP, d0, d1, d2)
+#define sys_ipc_resp4(d0, d1, d2, d3) syscall4(SYS_IPC_RESP, d0, d1, d2, d3)
-#define sys_ipc_ghost0(pid) syscall1(SYS_IPC_GHOST, pid)
-#define sys_ipc_ghost1(pid, d0) syscall2(SYS_IPC_GHOST, pid, d0)
-#define sys_ipc_ghost2(pid, d0, d1) syscall3(SYS_IPC_GHOST, pid, d0, d1)
-#define sys_ipc_ghost3(pid, d0, d1, d2) syscall4(SYS_IPC_GHOST, pid, d0, d1, d2)
-#define sys_ipc_ghost4(pid, d0, d1, d2, d3) syscall5(SYS_IPC_GHOST, pid, d0, d1, d2, d3)
+#define sys_ipc_ghost0() syscall1(SYS_IPC_GHOST)
+#define sys_ipc_ghost1(d0) syscall2(SYS_IPC_GHOST, d0)
+#define sys_ipc_ghost2(d0, d1) syscall3(SYS_IPC_GHOST, d0, d1)
+#define sys_ipc_ghost3(d0, d1, d2) syscall4(SYS_IPC_GHOST, d0, d1, d2)
+#define sys_ipc_ghost4(d0, d1, d2, d3) syscall5(SYS_IPC_GHOST, d0, d1, d2, d3)
static inline enum sys_status sys_set_handler(id_t tid, id_t pid)
{
diff --git a/tests/ipc-req/check.mk b/tests/ipc-req/check.mk
new file mode 100644
index 0000000..db9f580
--- /dev/null
+++ b/tests/ipc-req/check.mk
@@ -0,0 +1,4 @@
+ipc-req: do-ipc-req
+ @grep 'BUG' reports/ipc-req/log \
+ && echo 'BUG' > reports/ipc-req/OK \
+ || tail -n1 reports/ipc-req/log | tr -d '\r' > reports/ipc-req/OK
diff --git a/tests/ipc-req/init.c b/tests/ipc-req/init.c
new file mode 100644
index 0000000..7f1c6aa
--- /dev/null
+++ b/tests/ipc-req/init.c
@@ -0,0 +1,36 @@
+#include <common/test.h>
+
+START(pid, tid, d0, d1, d2, d3)
+{
+ check(pid == 0 || pid == 1, "illegal pid for init");
+ if (pid == 0) {
+ /* send request to ourselves */
+ printf("sending ipc req to ourselves\n");
+ struct sys_ret r = sys_ipc_req4(1, 1, 2, 3, 4);
+ printf("returned ipc req to ourselves\n");
+ check(r.s == OK, "not OK return\n");
+ check(r.a0 == 1, "not OK response ID\n");
+ check(r.a1 == 1, "not OK d0 response\n");
+ check(r.a2 == 2, "not OK d1 response\n");
+ check(r.a3 == 3, "not OK d2 response\n");
+ check(r.a4 == 4, "not OK d3 response\n");
+
+ /* try to request to non-existing proc */
+ r = sys_ipc_req0(200);
+ check(r.s != OK, "got OK return for illegal pid\n");
+ }
+ else if (pid == 1) {
+ printf("caught ipc req\n");
+ check(pid == 1, "illegal pid source\n");
+ check(tid == 1, "illegal tid source\n");
+ check(d0 == 1, "illegal d0\n");
+ check(d1 == 2, "illegal d1\n");
+ check(d2 == 3, "illegal d2\n");
+ check(d3 == 4, "illegal d3\n");
+
+ printf("sending response\n");
+ sys_ipc_resp4(1, 2, 3, 4);
+ }
+
+ ok();
+}
diff --git a/tests/ipc-req/source.mk b/tests/ipc-req/source.mk
new file mode 100644
index 0000000..0e65407
--- /dev/null
+++ b/tests/ipc-req/source.mk
@@ -0,0 +1,2 @@
+DO != ./scripts/gen-prog -n ipc-req -p init init.c
+DO != ./scripts/gen-simple -n ipc-req -p init