@@ -46,7 +46,7 @@ typedef struct {
46
46
} event_t ;
47
47
48
48
typedef struct {
49
- event_t * base ;
49
+ uint32_t base ;
50
50
size_t end ;
51
51
} event_queue_t ;
52
52
@@ -64,7 +64,7 @@ typedef struct {
64
64
} submission_t ;
65
65
66
66
typedef struct {
67
- submission_t * base ;
67
+ uint32_t base ;
68
68
size_t start ;
69
69
} submission_queue_t ;
70
70
@@ -76,27 +76,35 @@ static SDL_Texture *texture;
76
76
static uint32_t queues_capacity ;
77
77
static uint32_t event_count ;
78
78
static event_queue_t event_queue = {
79
- .base = NULL ,
79
+ .base = 0 ,
80
80
.end = 0 ,
81
81
};
82
82
static submission_queue_t submission_queue = {
83
- .base = NULL ,
83
+ .base = 0 ,
84
84
.start = 0 ,
85
85
};
86
86
87
- static submission_t submission_pop (void )
87
+ static submission_t submission_pop (struct riscv_t * rv )
88
88
{
89
- submission_t submission = submission_queue .base [submission_queue .start ++ ];
89
+ state_t * s = rv_userdata (rv );
90
+ submission_t submission ;
91
+ memory_read (
92
+ s -> mem , (void * ) & submission ,
93
+ submission_queue .base + submission_queue .start * sizeof (submission_t ),
94
+ sizeof (submission_t ));
95
+ ++ submission_queue .start ;
90
96
submission_queue .start &= queues_capacity - 1 ;
91
97
return submission ;
92
98
}
93
99
94
100
static void event_push (struct riscv_t * rv , event_t event )
95
101
{
96
- event_queue .base [event_queue .end ++ ] = event ;
102
+ state_t * s = rv_userdata (rv );
103
+ memory_write (s -> mem , event_queue .base + event_queue .end * sizeof (event_t ),
104
+ (void * ) & event , sizeof (event_t ));
105
+ ++ event_queue .end ;
97
106
event_queue .end &= queues_capacity - 1 ;
98
107
99
- state_t * s = rv_userdata (rv );
100
108
uint32_t count ;
101
109
memory_read (s -> mem , (void * ) & count , event_count , sizeof (uint32_t ));
102
110
count += 1 ;
@@ -235,7 +243,7 @@ void syscall_draw_frame(struct riscv_t *rv)
235
243
void syscall_setup_queue (struct riscv_t * rv )
236
244
{
237
245
/* setup_queue(base, capacity, event_count) */
238
- void * base = ( void * ) ( uintptr_t ) rv_get_reg (rv , rv_reg_a0 );
246
+ uint32_t base = rv_get_reg (rv , rv_reg_a0 );
239
247
queues_capacity = rv_get_reg (rv , rv_reg_a1 );
240
248
event_count = rv_get_reg (rv , rv_reg_a2 );
241
249
@@ -250,7 +258,7 @@ void syscall_submit_queue(struct riscv_t *rv)
250
258
uint32_t count = rv_get_reg (rv , rv_reg_a0 );
251
259
252
260
while (count -- ) {
253
- submission_t submission = submission_pop ();
261
+ submission_t submission = submission_pop (rv );
254
262
255
263
switch (submission .type ) {
256
264
case RELATIVE_MODE_SUBMISSION :
0 commit comments