1/*
2 * Copyright 2019, Data61, CSIRO (ABN 41 687 119 230)
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6#pragma once
7
8/***
9 * @module generic_forward_device.h
10 * This interface facilitates the creation of a virtual device used for
11 * dispatching faults to external handlers. For example when using CAmkES,
12 * a device frame for a real device can be given to a different CAmkES component
13 * and this virtual device will forward read and write faults over a CAmkES
14 * interface so the component can perform or emulate the actions.
15 */
16
17#include <stdint.h>
18#include <sel4vm/guest_vm.h>
19#include <sel4vmmplatsupport/device.h>
20
21typedef void (*forward_write_fn)(uint32_t addr, uint32_t value);
22typedef uint32_t (*forward_read_fn)(uint32_t addr);
23
24/***
25 * @struct generic_forward_cfg
26 * Interface for forwarding read and write faults
27 * @param {forward_write_fn} write_fn   A callback for forwarding write faults
28 * @param {forward_read_fn} read_fn     A callback for forwarding read faults
29 */
30struct generic_forward_cfg {
31    forward_write_fn write_fn;
32    forward_read_fn read_fn;
33};
34
35/***
36 * @function vm_install_generic_forward_device(vm, d, cfg)
37 * Install the virtual forwarding device into a VM instance
38 * @param {vm_t *} vm                   A handle to the VM
39 * @param {const struct device *}       Virtual device being forwarded
40 * @param {struct generic_forward_cfg}  Interface for forwarding the devices read and write faults
41 * @return                              -1 for error, otherwise 0 for success
42 */
43int vm_install_generic_forward_device(vm_t *vm, const struct device *d,
44                                      struct generic_forward_cfg cfg);
45