Skip to content

Commit

Permalink
feat(core/remote_io): add Remote I/O infrastructure
Browse files Browse the repository at this point in the history
This commit introduces the foundational support for VirtIO by implementing
a mechanism to forward VirtIO requests bidirectionally between the
guest VM (or frontend VM) and its associated backend VM.

Signed-off-by: João Peixoto <[email protected]>
  • Loading branch information
joaopeixoto13 committed Nov 5, 2024
1 parent f9d8d0c commit 583b36f
Show file tree
Hide file tree
Showing 11 changed files with 796 additions and 1 deletion.
17 changes: 17 additions & 0 deletions scripts/config_defs_gen.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,21 @@
#include <stdio.h>
#include <config.h>

static size_t remio_dev_num(void)
{
size_t dev_num = 0;
for (size_t vm_id = 0; vm_id < config.vmlist_size; vm_id++) {
struct vm_config* vm_config = &config.vmlist[vm_id];
for (size_t i = 0; i < vm_config->platform.remio_dev_num; i++) {
struct remio_dev* dev = &vm_config->platform.remio_devs[i];
if (dev->type == REMIO_DEV_BACKEND) {
dev_num++;
}
}
}
return dev_num;
}

int main() {
size_t vcpu_num = 0;
for (size_t i = 0; i < config.vmlist_size; i++) {
Expand All @@ -21,5 +36,7 @@ int main() {
printf("#define CONFIG_HYP_BASE_ADDR PLAT_BASE_ADDR\n");
}

printf("#define CONFIG_REMIO_DEV_NUM %ld\n", remio_dev_num());

return 0;
}
3 changes: 3 additions & 0 deletions src/core/hypercall.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ long int hypercall(unsigned long id)
case HC_IPC:
ret = ipc_hypercall();
break;
case HC_REMIO:
ret = remio_hypercall();
break;
default:
WARNING("Unknown hypercall id %d", id);
}
Expand Down
1 change: 1 addition & 0 deletions src/core/inc/config_defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#define CONFIG_VCPU_NUM 1
#define CONFIG_VM_NUM 1
#define CONFIG_HYP_BASE_ADDR 0
#define CONFIG_REMIO_DEV_NUM 0

#else /* GENERATING_DEFS */

Expand Down
2 changes: 1 addition & 1 deletion src/core/inc/hypercall.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#include <arch/hypercall.h>
#include <vm.h>

enum { HC_INVAL = 0, HC_IPC = 1 };
enum { HC_INVAL = 0, HC_IPC = 1, HC_REMIO = 2 };

enum { HC_E_SUCCESS = 0, HC_E_FAILURE = 1, HC_E_INVAL_ID = 2, HC_E_INVAL_ARGS = 3 };

Expand Down
84 changes: 84 additions & 0 deletions src/core/inc/remio.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/**
* SPDX-License-Identifier: Apache-2.0
* Copyright (c) Bao Project and Contributors. All rights reserved.
*/

/**
* @file remio.h
* @brief This header file contains the Remote I/O device interface
*/

#ifndef REMIO_H
#define REMIO_H

#include <bao.h>
#include <emul.h>
#include <list.h>
#include <vm.h>

/**
* @struct remio_shmem
* @brief This structure represents a shared memory region used by a Remote I/O device
*/
struct remio_shmem {
paddr_t base; /**< Shared memory base address */
size_t size; /**< Shared memory size */
size_t shmem_id; /**< Shared memory ID */
};

/**
* @enum REMIO_DEV_TYPE
* @brief This enum represents the Remote I/O device type
*/
enum REMIO_DEV_TYPE {
REMIO_DEV_FRONTEND = 0, /**< Remote I/O frontend device */
REMIO_DEV_BACKEND /**< Remote I/O backend device */
};

/**
* @struct remio_dev
* @brief This structure represents a Remote I/O device
* @note The device can be either a frontend (driver) or a backend (device)
*/
struct remio_dev {
vaddr_t va; /**< Frontend MMIO base virtual address */
size_t size; /**< Frontend MMIO size */
irqid_t interrupt; /**< Frontend/backend interrupt number */
remio_bind_key_t bind_key; /**< Remote I/O bind key */
enum REMIO_DEV_TYPE type; /**< Type of the Remote I/O device */
struct remio_shmem shmem; /**< Shared memory region */
struct emul_mem emul; /**< Frontend MMIO emulation memory */
};

/**
* @brief Remote I/O device initialization routine
* @note Executed only once by the master CPU
*/
void remio_init(void);

/**
* @brief Remote I/O device VM CPU assignment routine
* @note Executed by each VM that holds a Remote I/O device, it is responsible for
* assigning the frontend or backend CPU ID for the respective Remote I/O device
* If the VM was alloacted with more than one CPU the assigned CPU will be the
* one with the lowest ID, since only one CPU is required to inject VM interrupts
* @param vm Pointer to the VM structure
*/
void remio_assign_vm_cpus(struct vm* vm);

/**
* @brief Remote I/O hypercall callback
* @note Used to exchange information between the Remote I/O system and the backend VM
* @return Returns the number of pending I/O requests
*/
long int remio_hypercall(void);

/**
* @brief Remote I/O MMIO emulation handler
* @note Executed by the frontend VM when a MMIO access is performed
* @param emul_access Holds the information about the MMIO access
* @return Returns true if handled successfully, false otherwise
*/
bool remio_mmio_emul_handler(struct emul_access* emul_access);

#endif /* __REMIO_H__ */
2 changes: 2 additions & 0 deletions src/core/inc/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ typedef unsigned deviceid_t;

typedef size_t objpool_id_t;

typedef size_t remio_bind_key_t;

typedef enum AS_SEC {
/*--- HYP AS SECTIONS -----*/
SEC_HYP_GLOBAL = 0,
Expand Down
7 changes: 7 additions & 0 deletions src/core/inc/vm.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <bitmap.h>
#include <io.h>
#include <ipc.h>
#include <remio.h>

struct vm_mem_region {
paddr_t base;
Expand Down Expand Up @@ -47,6 +48,9 @@ struct vm_platform {
size_t dev_num;
struct vm_dev_region* devs;

size_t remio_dev_num;
struct remio_dev* remio_devs;

// /**
// * In MPU-based platforms which might also support virtual memory
// * (i.e. aarch64 cortex-r) the hypervisor sets up the VM using an MPU by
Expand Down Expand Up @@ -84,6 +88,9 @@ struct vm {

size_t ipc_num;
struct ipc* ipcs;

size_t remio_dev_num;
struct remio_dev* remio_devs;
};

struct vcpu {
Expand Down
1 change: 1 addition & 0 deletions src/core/objects.mk
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ core-objs-y+=ipc.o
core-objs-y+=objpool.o
core-objs-y+=hypercall.o
core-objs-y+=shmem.o
core-objs-y+=remio.o
Loading

0 comments on commit 583b36f

Please sign in to comment.