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
Arch_handleFaultReply(tcb_t * receiver,tcb_t * sender,word_t faultType)13 bool_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
Arch_setMRs_fault(tcb_t * sender,tcb_t * receiver,word_t * receiveIPCBuffer,word_t faultType)24 word_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
41 word_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
53 VISIBLE
handleKernelException(word_t vector,word_t errcode,word_t ip,word_t sp,word_t flags,word_t cr0,word_t cr2,word_t cr3,word_t cr4)54 word_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