1/* 2 * Copyright 2017, Data61 3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO) 4 * ABN 41 687 119 230. 5 * 6 * This software may be distributed and modified according to the terms of 7 * the GNU General Public License version 2. Note that NO WARRANTY is provided. 8 * See "LICENSE_GPLv2.txt" for details. 9 * 10 * @TAG(DATA61_GPL) 11 */ 12 13#include <types.h> 14#include <machine/io.h> 15#include <api/faults.h> 16#include <api/syscall.h> 17#include <util.h> 18 19bool_t Arch_handleFaultReply(tcb_t *receiver, tcb_t *sender, word_t faultType) 20{ 21 switch (faultType) { 22 case seL4_Fault_VMFault: 23 return true; 24 25 default: 26 fail("Invalid fault"); 27 } 28} 29 30word_t 31Arch_setMRs_fault(tcb_t *sender, tcb_t* receiver, word_t *receiveIPCBuffer, word_t faultType) 32{ 33 switch (faultType) { 34 case seL4_Fault_VMFault: { 35 setMR(receiver, receiveIPCBuffer, seL4_VMFault_IP, getRestartPC(sender)); 36 setMR(receiver, receiveIPCBuffer, seL4_VMFault_Addr, 37 seL4_Fault_VMFault_get_address(sender->tcbFault)); 38 setMR(receiver, receiveIPCBuffer, seL4_VMFault_PrefetchFault, 39 seL4_Fault_VMFault_get_instructionFault(sender->tcbFault)); 40 return setMR(receiver, receiveIPCBuffer, seL4_VMFault_FSR, 41 seL4_Fault_VMFault_get_FSR(sender->tcbFault)); 42 } 43 default: 44 fail("Invalid fault"); 45 } 46} 47 48word_t handleKernelException( 49 word_t vector, 50 word_t errcode, 51 word_t ip, 52 word_t sp, 53 word_t flags, 54 word_t cr0, 55 word_t cr2, 56 word_t cr3, 57 word_t cr4 58); 59 60VISIBLE 61word_t handleKernelException( 62 word_t vector, 63 word_t errcode, 64 word_t ip, 65 word_t sp, 66 word_t flags, 67 word_t cr0, 68 word_t cr2, 69 word_t cr3, 70 word_t cr4 71) 72{ 73 word_t i; 74 75 /* Check if we are in a state where we expect a GP fault, if so record it and return */ 76 if (vector == int_gp_fault && ARCH_NODE_STATE(x86KSGPExceptReturnTo) != 0) { 77 word_t ret = ARCH_NODE_STATE(x86KSGPExceptReturnTo); 78 ARCH_NODE_STATE(x86KSGPExceptReturnTo) = 0; 79 return ret; 80 } 81 printf("\n========== KERNEL EXCEPTION ==========\n"); 82 printf("Vector: 0x%lx\n", vector); 83 printf("ErrCode: 0x%lx\n", errcode); 84 printf("IP: 0x%lx\n", ip); 85 printf("SP: 0x%lx\n", sp); 86 printf("FLAGS: 0x%lx\n", flags); 87 printf("CR0: 0x%lx\n", cr0); 88 printf("CR2: 0x%lx (page-fault address)\n", cr2); 89 printf("CR3: 0x%lx (page-directory physical address)\n", cr3); 90 printf("CR4: 0x%lx\n", cr4); 91 printf("\nStack Dump:\n"); 92 for (i = 0; i < 20; i++) { 93 word_t UNUSED stack = sp + i * sizeof(word_t); 94 printf("*0x%lx == 0x%lx\n", stack, *(word_t*)stack); 95 } 96 printf("\nHalting...\n"); 97 halt(); 98 UNREACHABLE(); 99} 100