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