2021-05-01 10:05:21 +00:00
|
|
|
/* SPDX-License-Identifier: MIT */
|
|
|
|
|
|
|
|
#ifndef HV_H
|
|
|
|
#define HV_H
|
|
|
|
|
2021-05-14 20:47:43 +00:00
|
|
|
#include "iodev.h"
|
2021-05-01 10:05:21 +00:00
|
|
|
#include "types.h"
|
2021-05-15 14:55:34 +00:00
|
|
|
#include "uartproxy.h"
|
2021-05-01 10:05:21 +00:00
|
|
|
|
2021-05-04 18:29:11 +00:00
|
|
|
typedef bool(hv_hook_t)(u64 addr, u64 *val, bool write, int width);
|
|
|
|
|
2021-05-15 13:03:29 +00:00
|
|
|
#define MMIO_EVT_WIDTH GENMASK(2, 0)
|
|
|
|
#define MMIO_EVT_WRITE BIT(3)
|
|
|
|
|
|
|
|
struct hv_evt_mmiotrace {
|
|
|
|
u32 flags;
|
|
|
|
u32 reserved;
|
|
|
|
u64 pc;
|
|
|
|
u64 addr;
|
|
|
|
u64 data;
|
|
|
|
};
|
|
|
|
|
2021-05-15 14:55:34 +00:00
|
|
|
struct hv_vm_proxy_hook_data {
|
|
|
|
u32 flags;
|
|
|
|
u32 id;
|
|
|
|
u64 addr;
|
|
|
|
u64 data;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef enum _hv_hook_type {
|
|
|
|
HV_HOOK_VM = 1,
|
|
|
|
} hv_hook_type;
|
|
|
|
|
2021-05-04 06:38:17 +00:00
|
|
|
/* VM */
|
|
|
|
void hv_pt_init(void);
|
2021-05-01 10:05:21 +00:00
|
|
|
int hv_map(u64 from, u64 to, u64 size, u64 incr);
|
|
|
|
int hv_unmap(u64 from, u64 size);
|
|
|
|
int hv_map_hw(u64 from, u64 to, u64 size);
|
|
|
|
int hv_map_sw(u64 from, u64 to, u64 size);
|
2021-05-04 18:29:11 +00:00
|
|
|
int hv_map_hook(u64 from, hv_hook_t *hook, u64 size);
|
2021-05-15 14:55:34 +00:00
|
|
|
int hv_map_proxy_hook(u64 from, u64 id, u64 size);
|
2021-05-04 18:27:19 +00:00
|
|
|
u64 hv_translate(u64 addr, bool s1only, bool w);
|
2021-05-04 18:29:11 +00:00
|
|
|
u64 hv_pt_walk(u64 addr);
|
|
|
|
bool hv_handle_dabort(u64 *regs);
|
2021-05-04 06:38:17 +00:00
|
|
|
|
2021-05-04 18:30:07 +00:00
|
|
|
/* Virtual peripherals */
|
2021-05-14 20:47:43 +00:00
|
|
|
void hv_map_vuart(u64 base, iodev_id_t iodev);
|
2021-05-04 18:30:07 +00:00
|
|
|
|
2021-05-15 14:55:34 +00:00
|
|
|
/* Exceptions */
|
|
|
|
void hv_exc_proxy(u64 *regs, uartproxy_boot_reason_t reason, uartproxy_exc_code_t type,
|
|
|
|
void *extra);
|
|
|
|
|
2021-05-04 06:38:17 +00:00
|
|
|
/* HV main */
|
|
|
|
void hv_init(void);
|
2021-05-01 10:05:21 +00:00
|
|
|
void hv_start(void *entry, u64 regs[4]);
|
|
|
|
|
|
|
|
#endif
|