26
26
#define VNET_QUEUE_NUM_MAX 1024
27
27
#define VNET_QUEUE (vnet->queues[vnet->QueueSel])
28
28
29
- #define VNET_PREPROCESS_ADDR (addr ) \
30
- ((addr) < RAM_SIZE && !((addr) &0b11) ? ((addr) >> 2) \
31
- : (virtio_net_set_fail(vnet), 0))
32
-
33
29
#define PRIV (x ) ((struct virtio_net_config *) x->priv)
34
30
35
31
enum { VNET_QUEUE_RX = 0 , VNET_QUEUE_TX = 1 };
@@ -51,6 +47,14 @@ static void virtio_net_set_fail(virtio_net_state_t *vnet)
51
47
vnet -> InterruptStatus |= VIRTIO_INT__CONF_CHANGE ;
52
48
}
53
49
50
+ static inline uint32_t vnet_preprocess (virtio_net_state_t * vnet , uint32_t addr )
51
+ {
52
+ if ((addr >= RAM_SIZE ) || (addr & 0b11 ))
53
+ return virtio_net_set_fail (vnet ), 0 ;
54
+
55
+ return addr >> 2 ;
56
+ }
57
+
54
58
static void virtio_net_update_status (virtio_net_state_t * vnet , uint32_t status )
55
59
{
56
60
vnet -> Status |= status ;
@@ -327,21 +331,21 @@ static bool virtio_net_reg_write(virtio_net_state_t *vnet,
327
331
1 ; /* set VIRTQ_AVAIL_F_NO_INTERRUPT */
328
332
return true;
329
333
case _ (QueueDescLow ):
330
- VNET_QUEUE .QueueDesc = VNET_PREPROCESS_ADDR ( value );
334
+ VNET_QUEUE .QueueDesc = vnet_preprocess ( vnet , value );
331
335
return true;
332
336
case _ (QueueDescHigh ):
333
337
if (value )
334
338
virtio_net_set_fail (vnet );
335
339
return true;
336
340
case _ (QueueDriverLow ):
337
- VNET_QUEUE .QueueAvail = VNET_PREPROCESS_ADDR ( value );
341
+ VNET_QUEUE .QueueAvail = vnet_preprocess ( vnet , value );
338
342
return true;
339
343
case _ (QueueDriverHigh ):
340
344
if (value )
341
345
virtio_net_set_fail (vnet );
342
346
return true;
343
347
case _ (QueueDeviceLow ):
344
- VNET_QUEUE .QueueUsed = VNET_PREPROCESS_ADDR ( value );
348
+ VNET_QUEUE .QueueUsed = vnet_preprocess ( vnet , value );
345
349
return true;
346
350
case _ (QueueDeviceHigh ):
347
351
if (value )
0 commit comments