Skip to content

Commit df5d746

Browse files
committed
Implement virtio-input devices
1 parent c328142 commit df5d746

File tree

9 files changed

+1988
-12
lines changed

9 files changed

+1988
-12
lines changed

Makefile

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,16 @@ ifeq ($(call has, VIRTIONET), 1)
5353
OBJS_EXTRA += netdev.o
5454
endif
5555

56+
# virtio-input
57+
ENABLE_VIRTIOINPUT ?= 1
58+
ifneq ($(UNAME_S),Linux)
59+
ENABLE_VIRTIOINPUT := 0
60+
endif
61+
$(call set-feature, VIRTIOINPUT)
62+
ifeq ($(call has, VIRTIOINPUT), 1)
63+
OBJS_EXTRA += virtio-input.o
64+
endif
65+
5666
# virtio-gpu
5767
ENABLE_VIRTIOGPU ?= 1
5868
ifneq ($(UNAME_S),Linux)

common.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
#include "feature.h"
44

5+
#define BITS_PER_CHAR 8
6+
#define BITS_PER_LONG (BITS_PER_CHAR * sizeof(long))
7+
58
#define unlikely(x) __builtin_expect((x), 0)
69
#define likely(x) __builtin_expect((x), 1)
710

@@ -17,6 +20,16 @@ static inline int ilog2(int x)
1720
return 31 - __builtin_clz(x | 1);
1821
}
1922

23+
static inline void set_bit(unsigned long bit, unsigned long *word)
24+
{
25+
*word |= (1 << bit);
26+
}
27+
28+
static inline void bitmap_set_bit(unsigned long *map, unsigned long bit)
29+
{
30+
set_bit(bit % BITS_PER_LONG, &map[bit / BITS_PER_LONG]);
31+
}
32+
2033
/* Range check
2134
* For any variable range checking:
2235
* if (x >= minx && x <= maxx) ...

device.h

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
#define DTB_SIZE (1 * 1024 * 1024)
1111
#define INITRD_SIZE (65 * 1024 * 1024)
1212

13+
#define SCREEN_WIDTH 1024
14+
#define SCREEN_HEIGHT 768
15+
1316
void ram_read(hart_t *core,
1417
uint32_t *mem,
1518
const uint32_t addr,
@@ -271,6 +274,64 @@ void virtio_gpu_add_scanout(virtio_gpu_state_t *vgpu,
271274
uint32_t height);
272275
#endif /* SEMU_HAS(VIRTIOGPU) */
273276

277+
/* VirtIO Input */
278+
279+
#if SEMU_HAS(VIRTIOINPUT)
280+
281+
#define IRQ_VINPUT_KEYBOARD 6
282+
#define IRQ_VINPUT_KEYBOARD_BIT (1 << IRQ_VINPUT_KEYBOARD)
283+
284+
#define IRQ_VINPUT_MOUSE 7
285+
#define IRQ_VINPUT_MOUSE_BIT (1 << IRQ_VINPUT_MOUSE)
286+
287+
typedef struct {
288+
uint32_t QueueNum;
289+
uint32_t QueueDesc;
290+
uint32_t QueueAvail;
291+
uint32_t QueueUsed;
292+
uint16_t last_avail;
293+
bool ready;
294+
} virtio_input_queue_t;
295+
296+
typedef struct {
297+
/* feature negotiation */
298+
uint32_t DeviceFeaturesSel;
299+
uint32_t DriverFeatures;
300+
uint32_t DriverFeaturesSel;
301+
/* queue config */
302+
uint32_t QueueSel;
303+
virtio_input_queue_t queues[2];
304+
/* status */
305+
uint32_t Status;
306+
uint32_t InterruptStatus;
307+
/* supplied by environment */
308+
uint32_t *ram;
309+
/* implementation-specific */
310+
int id; // FIXME
311+
void *priv;
312+
} virtio_input_state_t;
313+
314+
void virtio_input_read(hart_t *vm,
315+
virtio_input_state_t *vinput,
316+
uint32_t addr,
317+
uint8_t width,
318+
uint32_t *value);
319+
320+
void virtio_input_write(hart_t *vm,
321+
virtio_input_state_t *vinput,
322+
uint32_t addr,
323+
uint8_t width,
324+
uint32_t value);
325+
326+
void virtio_input_init(virtio_input_state_t *vinput);
327+
328+
void virtio_input_update_key(uint32_t key, uint32_t state);
329+
330+
void virtio_input_update_mouse_button_state(uint32_t button, bool pressed);
331+
332+
void virtio_input_update_cursor(uint32_t x, uint32_t y);
333+
#endif /* SEMU_HAS(VIRTIOINPUT) */
334+
274335
/* ACLINT MTIMER */
275336
typedef struct {
276337
/* A MTIMER device has two separate base addresses: one for the MTIME
@@ -377,6 +438,10 @@ typedef struct {
377438
#endif
378439
#if SEMU_HAS(VIRTIOGPU)
379440
virtio_gpu_state_t vgpu;
441+
#endif
442+
#if SEMU_HAS(VIRTIOINPUT)
443+
virtio_input_state_t vkeyboard;
444+
virtio_input_state_t vmouse;
380445
#endif
381446
/* ACLINT */
382447
mtimer_state_t mtimer;

feature.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,10 @@
1717
#define SEMU_FEATURE_VIRTIOGPU 1
1818
#endif
1919

20+
/* virtio-input */
21+
#ifndef SEMU_FEATURE_VIRTIOINPUT
22+
#define SEMU_FEATURE_VIRTIOINPUT 1
23+
#endif
24+
2025
/* Feature test macro */
2126
#define SEMU_HAS(x) SEMU_FEATURE_##x

0 commit comments

Comments
 (0)