diff --git a/arch/arm64/kernel/include/syscall_list.h b/arch/arm64/kernel/include/syscall_list.h index 5dd6243..709231d 100644 --- a/arch/arm64/kernel/include/syscall_list.h +++ b/arch/arm64/kernel/include/syscall_list.h @@ -128,6 +128,8 @@ SYSCALL_HANDLED(731, util_indicate_clone) SYSCALL_HANDLED(732, get_system) SYSCALL_HANDLED(733, util_register_desc) +SYSCALL_HANDLED(740, setkdebug) + /* McKernel Specific */ SYSCALL_HANDLED(801, swapout) SYSCALL_HANDLED(802, linux_mlock) diff --git a/arch/x86_64/kernel/include/syscall_list.h b/arch/x86_64/kernel/include/syscall_list.h index 8ef9bd0..16361ea 100644 --- a/arch/x86_64/kernel/include/syscall_list.h +++ b/arch/x86_64/kernel/include/syscall_list.h @@ -170,6 +170,8 @@ SYSCALL_HANDLED(731, util_indicate_clone) SYSCALL_HANDLED(732, get_system) SYSCALL_HANDLED(733, util_register_desc) +SYSCALL_HANDLED(740, setkdebug) + /* McKernel Specific */ SYSCALL_HANDLED(801, swapout) SYSCALL_HANDLED(802, linux_mlock) diff --git a/kernel/include/process.h b/kernel/include/process.h index 32fb880..d45f734 100644 --- a/kernel/include/process.h +++ b/kernel/include/process.h @@ -575,6 +575,7 @@ struct process { int process_rank; /* Rank in partition */ int coredump_barrier_count, coredump_barrier_count2; mcs_rwlock_lock_t coredump_lock; // lock for coredump + int debug_flags; }; /* diff --git a/kernel/procfs.c b/kernel/procfs.c index 277dbfe..ea78af3 100644 --- a/kernel/procfs.c +++ b/kernel/procfs.c @@ -445,6 +445,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result) else { *result = -EAGAIN; } + kprintf("read /proc/*/maps %d\n", result? 1: 0); goto out; } @@ -521,6 +522,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result) else { *result = -EAGAIN; } + kprintf("read /proc/*/pagemap %d\n", result? 1: 0); goto out; } @@ -573,6 +575,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result) else { *result = -EAGAIN; } + kprintf("read /proc/*/status %d\n", result? 1: 0); goto out; } range = lookup_process_memory_range(vm, 0, -1); diff --git a/kernel/syscall.c b/kernel/syscall.c index 7d4964e..6a9f3df 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -1651,6 +1651,18 @@ do_mmap(const uintptr_t addr0, const size_t len0, const int prot, } ihk_mc_spinlock_lock_noirq(&thread->vm->memory_range_lock); + if (thread->proc->debug_flags) { + // sleep 5 sec + unsigned long ts = rdtsc(); + unsigned long nanosecs = 5000000000L; + unsigned long tscs = nanosecs * 1000 / ihk_mc_get_ns_per_tsc(); + + kprintf("kernel debug sleep 5sec...\n"); + while (rdtsc() - ts < tscs) { + cpu_pause(); + } + kprintf("kernel debug wake up\n"); + } if (flags & MAP_FIXED) { /* clear specified address range */ @@ -9617,6 +9629,17 @@ SYSCALL_DECLARE(util_register_desc) return 0; } +SYSCALL_DECLARE(setkdebug) +{ + int flags = ihk_mc_syscall_arg0(ctx); + struct thread *mythread = cpu_local_var(current); + struct process *proc = mythread->proc; + + kprintf("set kernel debug flag pid=%d val=%d\n", proc->pid, flags); + proc->debug_flags = flags; + return 0; +} + void reset_cputime() { diff --git a/test/issues/452/C452.patch b/test/issues/452/C452.patch index 4393b4e..e69de29 100644 --- a/test/issues/452/C452.patch +++ b/test/issues/452/C452.patch @@ -1,107 +0,0 @@ -diff --git a/arch/arm64/kernel/include/syscall_list.h b/arch/arm64/kernel/include/syscall_list.h -index 5dd6243..709231d 100644 ---- a/arch/arm64/kernel/include/syscall_list.h -+++ b/arch/arm64/kernel/include/syscall_list.h -@@ -128,6 +128,8 @@ SYSCALL_HANDLED(731, util_indicate_clone) - SYSCALL_HANDLED(732, get_system) - SYSCALL_HANDLED(733, util_register_desc) - -+SYSCALL_HANDLED(740, setkdebug) -+ - /* McKernel Specific */ - SYSCALL_HANDLED(801, swapout) - SYSCALL_HANDLED(802, linux_mlock) -diff --git a/arch/x86_64/kernel/include/syscall_list.h b/arch/x86_64/kernel/include/syscall_list.h -index 8ef9bd0..16361ea 100644 ---- a/arch/x86_64/kernel/include/syscall_list.h -+++ b/arch/x86_64/kernel/include/syscall_list.h -@@ -170,6 +170,8 @@ SYSCALL_HANDLED(731, util_indicate_clone) - SYSCALL_HANDLED(732, get_system) - SYSCALL_HANDLED(733, util_register_desc) - -+SYSCALL_HANDLED(740, setkdebug) -+ - /* McKernel Specific */ - SYSCALL_HANDLED(801, swapout) - SYSCALL_HANDLED(802, linux_mlock) -diff --git a/kernel/include/process.h b/kernel/include/process.h -index 32fb880..d45f734 100644 ---- a/kernel/include/process.h -+++ b/kernel/include/process.h -@@ -575,6 +575,7 @@ struct process { - int process_rank; /* Rank in partition */ - int coredump_barrier_count, coredump_barrier_count2; - mcs_rwlock_lock_t coredump_lock; // lock for coredump -+ int debug_flags; - }; - - /* -diff --git a/kernel/procfs.c b/kernel/procfs.c -index 35d4778..615b7ac 100644 ---- a/kernel/procfs.c -+++ b/kernel/procfs.c -@@ -446,6 +446,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result) - else { - *result = -EAGAIN; - } -+ kprintf("read /proc/*/maps %d\n", result? 1: 0); - goto out; - } - -@@ -522,6 +523,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result) - else { - *result = -EAGAIN; - } -+ kprintf("read /proc/*/pagemap %d\n", result? 1: 0); - goto out; - } - -@@ -574,6 +576,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result) - else { - *result = -EAGAIN; - } -+ kprintf("read /proc/*/status %d\n", result? 1: 0); - goto out; - } - range = lookup_process_memory_range(vm, 0, -1); -diff --git a/kernel/syscall.c b/kernel/syscall.c -index 7d4964e..6a9f3df 100644 ---- a/kernel/syscall.c -+++ b/kernel/syscall.c -@@ -1651,6 +1651,18 @@ do_mmap(const uintptr_t addr0, const size_t len0, const int prot, - } - - ihk_mc_spinlock_lock_noirq(&thread->vm->memory_range_lock); -+ if (thread->proc->debug_flags) { -+ // sleep 5 sec -+ unsigned long ts = rdtsc(); -+ unsigned long nanosecs = 5000000000L; -+ unsigned long tscs = nanosecs * 1000 / ihk_mc_get_ns_per_tsc(); -+ -+ kprintf("kernel debug sleep 5sec...\n"); -+ while (rdtsc() - ts < tscs) { -+ cpu_pause(); -+ } -+ kprintf("kernel debug wake up\n"); -+ } - - if (flags & MAP_FIXED) { - /* clear specified address range */ -@@ -9617,6 +9629,17 @@ SYSCALL_DECLARE(util_register_desc) - return 0; - } - -+SYSCALL_DECLARE(setkdebug) -+{ -+ int flags = ihk_mc_syscall_arg0(ctx); -+ struct thread *mythread = cpu_local_var(current); -+ struct process *proc = mythread->proc; -+ -+ kprintf("set kernel debug flag pid=%d val=%d\n", proc->pid, flags); -+ proc->debug_flags = flags; -+ return 0; -+} -+ - void - reset_cputime() - {