12
12
#include "riscv.h"
13
13
#include "riscv_private.h"
14
14
15
+ #define PRIV (x ) ((emu_state_t *) x->priv)
16
+
15
17
/* Define fetch separately since it is simpler (fixed width, already checked
16
18
* alignment, only main RAM is executable).
17
19
*/
18
20
static void mem_fetch (vm_t * vm , uint32_t n_pages , uint32_t * * page_addr )
19
21
{
20
- emu_state_t * data = ( emu_state_t * ) vm -> priv ;
22
+ emu_state_t * data = PRIV ( vm ) ;
21
23
if (unlikely (n_pages >= RAM_SIZE / RV_PAGE_SIZE )) {
22
24
/* TODO: check for other regions */
23
25
vm_set_exception (vm , RV_EXC_FETCH_FAULT , vm -> exc_val );
@@ -29,15 +31,15 @@ static void mem_fetch(vm_t *vm, uint32_t n_pages, uint32_t **page_addr)
29
31
/* Similarly, only main memory pages can be used as page tables. */
30
32
static uint32_t * mem_page_table (const vm_t * vm , uint32_t ppn )
31
33
{
32
- emu_state_t * data = ( emu_state_t * ) vm -> priv ;
34
+ emu_state_t * data = PRIV ( vm ) ;
33
35
if (ppn < (RAM_SIZE / RV_PAGE_SIZE ))
34
36
return & data -> ram [ppn << (RV_PAGE_SHIFT - 2 )];
35
37
return NULL ;
36
38
}
37
39
38
40
static void emu_update_uart_interrupts (vm_t * vm )
39
41
{
40
- emu_state_t * data = ( emu_state_t * ) vm -> priv ;
42
+ emu_state_t * data = PRIV ( vm ) ;
41
43
u8250_update_interrupts (& data -> uart );
42
44
if (data -> uart .pending_ints )
43
45
data -> plic .active |= IRQ_UART_BIT ;
@@ -49,7 +51,7 @@ static void emu_update_uart_interrupts(vm_t *vm)
49
51
#if SEMU_HAS (VIRTIONET )
50
52
static void emu_update_vnet_interrupts (vm_t * vm )
51
53
{
52
- emu_state_t * data = ( emu_state_t * ) vm -> priv ;
54
+ emu_state_t * data = PRIV ( vm ) ;
53
55
if (data -> vnet .InterruptStatus )
54
56
data -> plic .active |= IRQ_VNET_BIT ;
55
57
else
@@ -61,7 +63,7 @@ static void emu_update_vnet_interrupts(vm_t *vm)
61
63
#if SEMU_HAS (VIRTIOBLK )
62
64
static void emu_update_vblk_interrupts (vm_t * vm )
63
65
{
64
- emu_state_t * data = ( emu_state_t * ) vm -> priv ;
66
+ emu_state_t * data = PRIV ( vm ) ;
65
67
if (data -> vblk .InterruptStatus )
66
68
data -> plic .active |= IRQ_VBLK_BIT ;
67
69
else
@@ -72,8 +74,7 @@ static void emu_update_vblk_interrupts(vm_t *vm)
72
74
73
75
static void mem_load (vm_t * vm , uint32_t addr , uint8_t width , uint32_t * value )
74
76
{
75
- emu_state_t * data = (emu_state_t * ) vm -> priv ;
76
-
77
+ emu_state_t * data = PRIV (vm );
77
78
/* RAM at 0x00000000 + RAM_SIZE */
78
79
if (addr < RAM_SIZE ) {
79
80
ram_read (vm , data -> ram , addr , width , value );
@@ -111,8 +112,7 @@ static void mem_load(vm_t *vm, uint32_t addr, uint8_t width, uint32_t *value)
111
112
112
113
static void mem_store (vm_t * vm , uint32_t addr , uint8_t width , uint32_t value )
113
114
{
114
- emu_state_t * data = (emu_state_t * ) vm -> priv ;
115
-
115
+ emu_state_t * data = PRIV (vm );
116
116
/* RAM at 0x00000000 + RAM_SIZE */
117
117
if (addr < RAM_SIZE ) {
118
118
ram_write (vm , data -> ram , addr , width , value );
@@ -159,7 +159,7 @@ typedef struct {
159
159
160
160
static inline sbi_ret_t handle_sbi_ecall_TIMER (vm_t * vm , int32_t fid )
161
161
{
162
- emu_state_t * data = ( emu_state_t * ) vm -> priv ;
162
+ emu_state_t * data = PRIV ( vm ) ;
163
163
switch (fid ) {
164
164
case SBI_TIMER__SET_TIMER :
165
165
data -> timer = (((uint64_t ) vm -> x_regs [RV_R_A1 ]) << 32 ) |
@@ -172,7 +172,7 @@ static inline sbi_ret_t handle_sbi_ecall_TIMER(vm_t *vm, int32_t fid)
172
172
173
173
static inline sbi_ret_t handle_sbi_ecall_RST (vm_t * vm , int32_t fid )
174
174
{
175
- emu_state_t * data = ( emu_state_t * ) vm -> priv ;
175
+ emu_state_t * data = PRIV ( vm ) ;
176
176
switch (fid ) {
177
177
case SBI_RST__SYSTEM_RESET :
178
178
fprintf (stderr , "system reset: type=%u, reason=%u\n" ,
0 commit comments