1/*
2 * Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6
7#include <assert.h>
8#include <arch/machine/registerset.h>
9#include <machine/fpu.h>
10#include <arch/object/structures.h>
11
12const register_t msgRegisters[] = {
13    R10, R8, R9, R15
14};
15compile_assert(
16    consistent_message_registers,
17    sizeof(msgRegisters) / sizeof(msgRegisters[0]) == n_msgRegisters
18);
19
20const register_t frameRegisters[] = {
21    FaultIP, RSP, FLAGS, RAX, RBX, RCX, RDX, RSI, RDI, RBP,
22    R8, R9, R10, R11, R12, R13, R14, R15
23};
24compile_assert(
25    consistent_frame_registers,
26    sizeof(frameRegisters) / sizeof(frameRegisters[0]) == n_frameRegisters
27);
28
29const register_t gpRegisters[] = {
30    FS_BASE, GS_BASE
31};
32compile_assert(
33    consistent_gp_registers,
34    sizeof(gpRegisters) / sizeof(gpRegisters[0]) == n_gpRegisters
35);
36
37void Mode_initContext(user_context_t *context)
38{
39    context->registers[RAX] = 0;
40    context->registers[RBX] = 0;
41    context->registers[RCX] = 0;
42    context->registers[RDX] = 0;
43    context->registers[RSI] = 0;
44    context->registers[RDI] = 0;
45    context->registers[RBP] = 0;
46    context->registers[R8]  = 0;
47    context->registers[R9]  = 0;
48    context->registers[R10] = 0;
49    context->registers[R11] = 0;
50    context->registers[R12] = 0;
51    context->registers[R13] = 0;
52    context->registers[R14] = 0;
53    context->registers[R15] = 0;
54    context->registers[RSP] = 0;
55}
56
57word_t Mode_sanitiseRegister(register_t reg, word_t v)
58{
59    if (reg == FaultIP || reg == NextIP || reg == FS_BASE || reg == GS_BASE) {
60        /* ensure instruction address is canonical */
61        if (v > 0x00007fffffffffff && v < 0xffff800000000000) {
62            /* no way to guess what the user wanted so give them zero */
63            v = 0;
64        }
65    }
66    return v;
67}
68
69#ifdef CONFIG_KERNEL_MCS
70word_t getNBSendRecvDest(void)
71{
72    return getRegister(NODE_STATE(ksCurThread), nbsendRecvDest);
73}
74#endif
75