From 35a5dc4c9266d3688f55a2021e440e22600a2aa9 Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Thu, 5 Nov 2009 15:56:01 +0200 Subject: [PATCH] Added userland support for exregs/read, mm0 slightly more graceful for illegal access --- conts/libl4/src/arm/exregs.c | 32 +++++++++++++++++++++ conts/posix/mm0/include/arch-arm/mm.h | 1 + conts/posix/mm0/mm/arch-arm/mm.c | 12 ++++++++ conts/posix/mm0/mm/fault.c | 6 ++-- conts/posix/test0/src/test_exec/test_exec.c | 3 ++ 5 files changed, 51 insertions(+), 3 deletions(-) diff --git a/conts/libl4/src/arm/exregs.c b/conts/libl4/src/arm/exregs.c index 9760a57..ccbb620 100644 --- a/conts/libl4/src/arm/exregs.c +++ b/conts/libl4/src/arm/exregs.c @@ -8,7 +8,39 @@ #include #include INC_GLUE(message.h) +void exregs_print_registers(void) +{ + struct exregs_data exregs; + /* Read registers */ + memset(&exregs, 0, sizeof(exregs)); + exregs.valid_vect = ~0; /* Set all flags */ + exregs.flags |= EXREGS_READ; + exregs.flags |= EXREGS_SET_UTCB; + exregs.flags |= EXREGS_SET_PAGER; + BUG_ON(l4_exchange_registers(&exregs, self_tid()) < 0); + + /* Print out registers */ + printf("Task (%x) register state upon fault:\n", self_tid()); + printf("R0: 0x%x\n", exregs.context.r0); + printf("R1: 0x%x\n", exregs.context.r1); + printf("R2: 0x%x\n", exregs.context.r2); + printf("R3: 0x%x\n", exregs.context.r3); + printf("R4: 0x%x\n", exregs.context.r4); + printf("R5: 0x%x\n", exregs.context.r5); + printf("R6: 0x%x\n", exregs.context.r6); + printf("R7: 0x%x\n", exregs.context.r7); + printf("R8: 0x%x\n", exregs.context.r8); + printf("R9: 0x%x\n", exregs.context.r9); + printf("R10: 0x%x\n", exregs.context.r10); + printf("R11: 0x%x\n", exregs.context.r11); + printf("R12: 0x%x\n", exregs.context.r12); + printf("R13: 0x%x\n", exregs.context.sp); + printf("R14: 0x%x\n", exregs.context.lr); + printf("R15: 0x%x\n", exregs.context.pc); + printf("Pager: 0x%x\n", exregs.pagerid); + printf("Utcb @ 0x%lx\n", exregs.utcb_address); +} void exregs_set_mr(struct exregs_data *s, int offset, unsigned long val) { diff --git a/conts/posix/mm0/include/arch-arm/mm.h b/conts/posix/mm0/include/arch-arm/mm.h index 6224afc..5fc5680 100644 --- a/conts/posix/mm0/include/arch-arm/mm.h +++ b/conts/posix/mm0/include/arch-arm/mm.h @@ -9,5 +9,6 @@ struct fault_data; unsigned int vm_prot_flags(pte_t pte); void set_generic_fault_params(struct fault_data *fault); +void fault_handle_error(struct fault_data *fault); #endif /* __INITTASK_ARCH_MM_H__ */ diff --git a/conts/posix/mm0/mm/arch-arm/mm.c b/conts/posix/mm0/mm/arch-arm/mm.c index 5781fee..c6ad81e 100644 --- a/conts/posix/mm0/mm/arch-arm/mm.c +++ b/conts/posix/mm0/mm/arch-arm/mm.c @@ -4,6 +4,7 @@ #include #include #include +#include /* Extracts generic protection flags from architecture-specific pte */ unsigned int vm_prot_flags(pte_t pte) @@ -38,6 +39,17 @@ void arch_print_fault_params(struct fault_data *fault) { } #endif +void fault_handle_error(struct fault_data *fault) +{ + struct task_ids ids; + + /* Suspend the task */ + ids.tid = fault->task->tid; + BUG_ON(l4_thread_control(THREAD_SUSPEND, &ids) < 0); + + BUG(); +} + /* * PTE STATES: * PTE type field: 00 (Translation fault) diff --git a/conts/posix/mm0/mm/fault.c b/conts/posix/mm0/mm/fault.c index d63a5c8..9991a5c 100644 --- a/conts/posix/mm0/mm/fault.c +++ b/conts/posix/mm0/mm/fault.c @@ -850,19 +850,19 @@ int do_page_fault(struct fault_data *fault) if (vma_flags & VM_NONE) { printf("Illegal access, tid: %d, address: 0x%x, PC @ 0x%x,\n", fault->task->tid, fault->address, fault->kdata->faulty_pc); - BUG(); + fault_handle_error(fault); } /* The access reason is not included in the vma's listed flags */ if (!(reason & vma_flags)) { printf("Illegal access, tid: %d, address: 0x%x, PC @ 0x%x\n", fault->task->tid, fault->address, fault->kdata->faulty_pc); - BUG(); + fault_handle_error(fault); } if ((reason & VM_EXEC) && (vma_flags & VM_EXEC)) { printf("Exec faults unsupported yet.\n"); - BUG(); /* Can't handle this yet. */ + fault_handle_error(fault); } /* Handle legitimate faults */ diff --git a/conts/posix/test0/src/test_exec/test_exec.c b/conts/posix/test0/src/test_exec/test_exec.c index 73678c3..4379735 100644 --- a/conts/posix/test0/src/test_exec/test_exec.c +++ b/conts/posix/test0/src/test_exec/test_exec.c @@ -32,6 +32,7 @@ int main(int argc, char *argv[]) char *parent_of_all; char pidbuf[10]; + printf("New task started: %d\n", __raw_tid(getpid())); /* Convert current pid to string */ sprintf(pidbuf, "%d", getpid()); @@ -44,6 +45,8 @@ int main(int argc, char *argv[]) goto out; } + printf("New task continues: %d\n", __raw_tid(getpid())); + /* Get parent of all pid as a string from environment */ parent_of_all = getenv("parent_of_all"); pagerid = ascii_to_int(getenv("pagerid"));