Skip to content

Commit 138e2b2

Browse files
committed
Introduce feature test macro and build options
The feature test macro SEMU_HAS(x) accepts the feature "x" and expands the predefined entry prefixing with "SEMU_FEATURE_". Then, we can check certain SEMU feature at build time as following: #if RV32_HAS(VIRTIONET) /* the operations associated with RV32_FEATURE_VIRTIONET. */ #endif
1 parent 3cad5dc commit 138e2b2

File tree

6 files changed

+60
-20
lines changed

6 files changed

+60
-20
lines changed

Makefile

+15-4
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,25 @@ CFLAGS += -include common.h
66

77
OBJS_EXTRA :=
88

9+
# virtio-blk
10+
ENABLE_VIRTIOBLK ?= 1
11+
OBJS_EXTRA += virtio-blk.o
12+
$(call set-feature, VIRTIOBLK)
13+
14+
# virtio-net
15+
ENABLE_VIRTIONET ?= 1
916
ifeq ($(UNAME_S),Linux)
10-
CFLAGS += -D ENABLE_VIRTIONET
11-
CFLAGS += -D ENABLE_VIRTIOBLK
1217
OBJS_EXTRA += virtio-net.o
13-
OBJS_EXTRA += virtio-blk.o
18+
else
19+
ENABLE_VIRTIONET := 0
20+
endif
21+
$(call set-feature, VIRTIONET)
22+
23+
# device tree
24+
# TODO: generate device tree source upon configurations
25+
ifeq ($(UNAME_S),Linux)
1426
MINIMAL_DTS = minimal-virtio.dts
1527
else
16-
CFLAGS += -D ENABLE_VIRTIOBLK
1728
MINIMAL_DTS = minimal.dts
1829
endif
1930

common.h

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#pragma once
22

3+
#include "feature.h"
4+
35
#define unlikely(x) __builtin_expect((x), 0)
46
#define likely(x) __builtin_expect((x), 1)
57

device.h

+6-6
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ void capture_keyboard_input();
7272

7373
/* VirtIO-Net */
7474

75-
#if defined(ENABLE_VIRTIONET)
75+
#if SEMU_HAS(VIRTIONET)
7676
#define IRQ_VNET 2
7777
#define IRQ_VNET_BIT (1 << IRQ_VNET)
7878

@@ -115,10 +115,10 @@ void virtio_net_write(vm_t *core,
115115
void virtio_net_refresh_queue(virtio_net_state_t *vnet);
116116

117117
bool virtio_net_init(virtio_net_state_t *vnet);
118-
#endif /* ENABLE_VIRTIONET */
118+
#endif /* SEMU_HAS(VIRTIONET) */
119119

120120
/* VirtIO-Block */
121-
#if defined(ENABLE_VIRTIOBLK)
121+
#if SEMU_HAS(VIRTIOBLK)
122122

123123
#define IRQ_VBLK 3
124124
#define IRQ_VBLK_BIT (1 << IRQ_VBLK)
@@ -162,7 +162,7 @@ void virtio_blk_write(vm_t *vm,
162162
uint32_t value);
163163

164164
uint32_t *virtio_blk_init(virtio_blk_state_t *vblk, char *disk_file);
165-
#endif /* ENABLE_VIRTIOBLK */
165+
#endif /* SEMU_HAS(VIRTIOBLK) */
166166

167167
/* memory mapping */
168168

@@ -172,10 +172,10 @@ typedef struct {
172172
uint32_t *disk;
173173
plic_state_t plic;
174174
u8250_state_t uart;
175-
#if defined(ENABLE_VIRTIONET)
175+
#if SEMU_HAS(VIRTIONET)
176176
virtio_net_state_t vnet;
177177
#endif
178-
#if defined(ENABLE_VIRTIOBLK)
178+
#if SEMU_HAS(VIRTIOBLK)
179179
virtio_blk_state_t vblk;
180180
#endif
181181
uint32_t timer_lo, timer_hi;

feature.h

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#pragma once
2+
3+
/* enable/disable (compile time) features in this header */
4+
5+
/* virtio-blk */
6+
#ifndef SEMU_FEATUREVIRTIOBLK
7+
#define SEMU_FEATUREVIRTIOBLK 1
8+
#endif
9+
10+
/* virtio-net */
11+
#ifndef SEMU_FEATUREVIRTIONET
12+
#define SEMU_FEATUREVIRTIONET 1
13+
#endif
14+
15+
/* Feature test macro */
16+
#define SEMU_HAS(x) SEMU_FEATURE_##x

main.c

+10-10
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ static void emu_update_uart_interrupts(vm_t *vm)
4646
plic_update_interrupts(vm, &data->plic);
4747
}
4848

49-
#if defined(ENABLE_VIRTIONET)
49+
#if SEMU_HAS(VIRTIONET)
5050
static void emu_update_vnet_interrupts(vm_t *vm)
5151
{
5252
emu_state_t *data = (emu_state_t *) vm->priv;
@@ -58,7 +58,7 @@ static void emu_update_vnet_interrupts(vm_t *vm)
5858
}
5959
#endif
6060

61-
#if defined(ENABLE_VIRTIOBLK)
61+
#if SEMU_HAS(VIRTIOBLK)
6262
static void emu_update_vblk_interrupts(vm_t *vm)
6363
{
6464
emu_state_t *data = (emu_state_t *) vm->priv;
@@ -92,13 +92,13 @@ static void mem_load(vm_t *vm, uint32_t addr, uint8_t width, uint32_t *value)
9292
u8250_read(vm, &data->uart, addr & 0xFFFFF, width, value);
9393
emu_update_uart_interrupts(vm);
9494
return;
95-
#if defined(ENABLE_VIRTIONET)
95+
#if SEMU_HAS(VIRTIONET)
9696
case 0x41: /* VirtIO-Net */
9797
virtio_net_read(vm, &data->vnet, addr & 0xFFFFF, width, value);
9898
emu_update_vnet_interrupts(vm);
9999
return;
100100
#endif
101-
#if defined(ENABLE_VIRTIOBLK)
101+
#if SEMU_HAS(VIRTIOBLK)
102102
case 0x42: /* virtio-blk */
103103
virtio_blk_read(vm, &data->vblk, addr & 0xFFFFF, width, value);
104104
emu_update_vblk_interrupts(vm);
@@ -131,13 +131,13 @@ static void mem_store(vm_t *vm, uint32_t addr, uint8_t width, uint32_t value)
131131
u8250_write(vm, &data->uart, addr & 0xFFFFF, width, value);
132132
emu_update_uart_interrupts(vm);
133133
return;
134-
#if defined(ENABLE_VIRTIONET)
134+
#if SEMU_HAS(VIRTIONET)
135135
case 0x41: /* VirtIO-Net */
136136
virtio_net_write(vm, &data->vnet, addr & 0xFFFFF, width, value);
137137
emu_update_vnet_interrupts(vm);
138138
return;
139139
#endif
140-
#if defined(ENABLE_VIRTIOBLK)
140+
#if SEMU_HAS(VIRTIOBLK)
141141
case 0x42: /* virtio-blk */
142142
virtio_blk_write(vm, &data->vblk, addr & 0xFFFFF, width, value);
143143
emu_update_vblk_interrupts(vm);
@@ -391,12 +391,12 @@ static int semu_start(int argc, char **argv)
391391
/* Set up peripherals */
392392
emu.uart.in_fd = 0, emu.uart.out_fd = 1;
393393
capture_keyboard_input(); /* set up uart */
394-
#if defined(ENABLE_VIRTIONET)
394+
#if SEMU_HAS(VIRTIONET)
395395
if (!virtio_net_init(&(emu.vnet)))
396396
fprintf(stderr, "No virtio-net functioned\n");
397397
emu.vnet.ram = emu.ram;
398398
#endif
399-
#if defined(ENABLE_VIRTIOBLK)
399+
#if SEMU_HAS(VIRTIOBLK)
400400
emu.vblk.ram = emu.ram;
401401
emu.disk = virtio_blk_init(&(emu.vblk), disk_file);
402402
#endif
@@ -411,13 +411,13 @@ static int semu_start(int argc, char **argv)
411411
if (emu.uart.in_ready)
412412
emu_update_uart_interrupts(&vm);
413413

414-
#if defined(ENABLE_VIRTIONET)
414+
#if SEMU_HAS(VIRTIONET)
415415
virtio_net_refresh_queue(&emu.vnet);
416416
if (emu.vnet.InterruptStatus)
417417
emu_update_vnet_interrupts(&vm);
418418
#endif
419419

420-
#if defined(ENABLE_VIRTIOBLK)
420+
#if SEMU_HAS(VIRTIOBLK)
421421
if (emu.vblk.InterruptStatus)
422422
emu_update_vblk_interrupts(&vm);
423423
#endif

mk/common.mk

+11
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,17 @@ else
1616
REDIR = >/dev/null
1717
endif
1818

19+
# Get specified feature
20+
POSITIVE_WORDS = 1 true yes
21+
define has
22+
$(if $(filter $(firstword $(ENABLE_$(strip $1))), $(POSITIVE_WORDS)),1,0)
23+
endef
24+
25+
# Set specified feature
26+
define set-feature
27+
$(eval CFLAGS += -D SEMU_FEATURE_$(strip $1)=$(call has, $1))
28+
endef
29+
1930
# Test suite
2031
PASS_COLOR = \e[32;01m
2132
NO_COLOR = \e[0m

0 commit comments

Comments
 (0)