hc
2024-03-25 edb30157bad0c0001c32b854271ace01d3b9a16a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/** @file
  RISC-V package definitions.
 
  Copyright (c) 2016 - 2019, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
 
  SPDX-License-Identifier: BSD-2-Clause-Patent
 
**/
 
#ifndef RISCV_H_
#define RISCV_H_
 
#include <Uefi.h>
#include <IndustryStandard/RiscV.h>
 
#define _ASM_FUNC(Name, Section)    \
  .global   Name                  ; \
  .section  #Section, "ax"        ; \
  .type     Name, %function       ; \
  .p2align  2                     ; \
  Name:
 
#define ASM_FUNC(Name) _ASM_FUNC(ASM_PFX(Name), .text. ## Name)
 
#if defined (MDE_CPU_RISCV64)
typedef UINT64 RISC_V_REGS_PROTOTYPE;
#else
#endif
 
//
// Structure for 128-bit value
//
typedef struct {
  UINT64            Value64_L;
  UINT64            Value64_H;
} RISCV_UINT128;
 
#define RISCV_MACHINE_CONTEXT_SIZE  0x1000
typedef struct _RISCV_MACHINE_MODE_CONTEXT RISCV_MACHINE_MODE_CONTEXT;
 
///
/// Exception handlers in context.
///
typedef struct _EXCEPTION_HANDLER_CONTEXT {
  EFI_PHYSICAL_ADDRESS InstAddressMisalignedHander;
  EFI_PHYSICAL_ADDRESS InstAccessFaultHander;
  EFI_PHYSICAL_ADDRESS IllegalInstHander;
  EFI_PHYSICAL_ADDRESS BreakpointHander;
  EFI_PHYSICAL_ADDRESS LoadAddrMisalignedHander;
  EFI_PHYSICAL_ADDRESS LoadAccessFaultHander;
  EFI_PHYSICAL_ADDRESS StoreAmoAddrMisalignedHander;
  EFI_PHYSICAL_ADDRESS StoreAmoAccessFaultHander;
  EFI_PHYSICAL_ADDRESS EnvCallFromUModeHander;
  EFI_PHYSICAL_ADDRESS EnvCallFromSModeHander;
  EFI_PHYSICAL_ADDRESS EnvCallFromHModeHander;
  EFI_PHYSICAL_ADDRESS EnvCallFromMModeHander;
} EXCEPTION_HANDLER_CONTEXT;
 
///
/// Exception handlers in context.
///
typedef struct _INTERRUPT_HANDLER_CONTEXT {
  EFI_PHYSICAL_ADDRESS SoftwareIntHandler;
  EFI_PHYSICAL_ADDRESS TimerIntHandler;
} INTERRUPT_HANDLER_CONTEXT;
 
///
/// Interrupt handlers in context.
///
typedef struct _TRAP_HANDLER_CONTEXT {
  EXCEPTION_HANDLER_CONTEXT ExceptionHandlerContext;
  INTERRUPT_HANDLER_CONTEXT IntHandlerContext;
} TRAP_HANDLER_CONTEXT;
 
///
/// Machine mode context used for saveing hart-local context.
///
typedef struct _RISCV_MACHINE_MODE_CONTEXT {
  EFI_PHYSICAL_ADDRESS PeiService;                /// PEI service.
  EFI_PHYSICAL_ADDRESS MachineModeTrapHandler;    /// Machine mode trap handler.
  EFI_PHYSICAL_ADDRESS HypervisorModeTrapHandler; /// Hypervisor mode trap handler.
  EFI_PHYSICAL_ADDRESS SupervisorModeTrapHandler; /// Supervisor mode trap handler.
  EFI_PHYSICAL_ADDRESS UserModeTrapHandler;       /// USer mode trap handler.
  TRAP_HANDLER_CONTEXT MModeHandler;              /// Handler for machine mode.
} RISCV_MACHINE_MODE_CONTEXT;
 
#endif