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