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