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