-
Notifications
You must be signed in to change notification settings - Fork 128
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(core/remote_io): add Remote I/O infrastructure
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
1 parent
f3b87e3
commit 0afe0bf
Showing
8 changed files
with
654 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
/** | ||
* SPDX-License-Identifier: Apache-2.0 | ||
* Copyright (c) Bao Project and Contributors. All rights reserved. | ||
*/ | ||
|
||
/** | ||
* @file remote_io.h | ||
* @brief This header file contains the Remote I/O device interface | ||
*/ | ||
|
||
#ifndef __REMOTE_IO_H__ | ||
#define __REMOTE_IO_H__ | ||
|
||
#include <bao.h> | ||
#include <emul.h> | ||
#include <list.h> | ||
#include <vm.h> | ||
|
||
/** | ||
* @struct remote_io_shmem | ||
* @brief This structure represents a shared memory region used by a Remote I/O device | ||
*/ | ||
struct remote_io_shmem { | ||
paddr_t base; /**< Shared memory base address */ | ||
size_t size; /**< Shared memory size */ | ||
size_t shmem_id; /**< Shared memory ID */ | ||
}; | ||
|
||
/** | ||
* @struct remote_io_dev | ||
* @brief This structure represents a Remote I/O device | ||
* @note The device can be either a frontend (driver) or a backend (device) | ||
*/ | ||
struct remote_io_dev { | ||
vaddr_t va; /**< Frontend MMIO base virtual address */ | ||
size_t size; /**< Frontend MMIO size */ | ||
irqid_t interrupt; /**< Frontend/backend interrupt number */ | ||
uint64_t id; /**< Remote I/O ID */ | ||
bool is_backend; /**< True if the device is a backend */ | ||
struct remote_io_shmem shmem; /**< Shared memory region */ | ||
}; | ||
|
||
/** | ||
* @brief Remote I/O device initialization routine | ||
* @note Executed only once by the master CPU | ||
*/ | ||
void remote_io_init(void); | ||
|
||
/** | ||
* @brief Remote I/O device 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 it is only required one CPU for VM interrupt injecting | ||
* @param vm Pointer to the VM structure | ||
*/ | ||
void remote_io_assign_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 | ||
* @param arg0 First argument of the hypercall | ||
* @param arg1 Second argument of the hypercall | ||
* @param arg2 Third argument of the hypercall | ||
* @return Returns the number of pending I/O requests | ||
*/ | ||
long int remote_io_hypercall(unsigned long arg0, unsigned long arg1, unsigned long arg2); | ||
|
||
/** | ||
* @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 remote_io_mmio_emul_handler(struct emul_access* emul_access); | ||
|
||
#endif /* __REMOTE_IO_H__ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.