mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20190903' into staging
target-arm queue: * Revert and correctly fix refactoring of unallocated_encoding() * Take exceptions on ATS instructions when needed * aspeed/timer: Provide back-pressure information for short periods * memory: Remove unused memory_region_iommu_replay_all() * hw/arm/smmuv3: Log a guest error when decoding an invalid STE * hw/arm/smmuv3: Remove spurious error messages on IOVA invalidations * target/arm: Fix SMMLS argument order * hw/arm: Use ARM_CPU_TYPE_NAME() macro when appropriate * hw/arm: Correct reference counting for creation of various objects * includes: remove stale [smp|max]_cpus externs * tcg/README: fix typo * atomic_template: fix indentation in GEN_ATOMIC_HELPER * include/exec/cpu-defs.h: fix typo * target/arm: Free TCG temps in trans_VMOV_64_sp() * target/arm: Don't abort on M-profile exception return in linux-user mode # gpg: Signature made Tue 03 Sep 2019 16:35:19 BST # gpg: using RSA key E1A5C593CD419DE28E8315CF3C2525ED14360CDE # gpg: issuer "peter.maydell@linaro.org" # gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" [ultimate] # gpg: aka "Peter Maydell <pmaydell@gmail.com>" [ultimate] # gpg: aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" [ultimate] # Primary key fingerprint: E1A5 C593 CD41 9DE2 8E83 15CF 3C25 25ED 1436 0CDE * remotes/pmaydell/tags/pull-target-arm-20190903: (21 commits) target/arm: Don't abort on M-profile exception return in linux-user mode target/arm: Free TCG temps in trans_VMOV_64_sp() include/exec/cpu-defs.h: fix typo atomic_template: fix indentation in GEN_ATOMIC_HELPER tcg/README: fix typo s/afterwise/afterwards/ includes: remove stale [smp|max]_cpus externs hw/net/xilinx_axi: Use object_initialize_child for correct ref. counting hw/dma/xilinx_axi: Use object_initialize_child for correct ref. counting hw/arm/fsl-imx: Add the cpu as child of the SoC object hw/arm: Use sysbus_init_child_obj for correct reference counting hw/arm: Use object_initialize_child for correct reference counting hw/arm: Use ARM_CPU_TYPE_NAME() macro when appropriate target/arm: Fix SMMLS argument order hw/arm/smmuv3: Remove spurious error messages on IOVA invalidations hw/arm/smmuv3: Log a guest error when decoding an invalid STE memory: Remove unused memory_region_iommu_replay_all() aspeed/timer: Provide back-pressure information for short periods target/arm: Take exceptions on ATS instructions when needed target/arm: Allow ARMCPRegInfo read/write functions to throw exceptions target/arm: Factor out unallocated_encoding for aarch32 ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
@@ -284,7 +284,7 @@ ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, target_ulong addr,
|
||||
|
||||
#define GEN_ATOMIC_HELPER(X) \
|
||||
ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
|
||||
ABI_TYPE val EXTRA_ARGS) \
|
||||
ABI_TYPE val EXTRA_ARGS) \
|
||||
{ \
|
||||
ATOMIC_MMU_DECLS; \
|
||||
DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; \
|
||||
|
||||
@@ -30,7 +30,8 @@ static void aw_a10_init(Object *obj)
|
||||
AwA10State *s = AW_A10(obj);
|
||||
|
||||
object_initialize_child(obj, "cpu", &s->cpu, sizeof(s->cpu),
|
||||
"cortex-a8-" TYPE_ARM_CPU, &error_abort, NULL);
|
||||
ARM_CPU_TYPE_NAME("cortex-a8"),
|
||||
&error_abort, NULL);
|
||||
|
||||
sysbus_init_child_obj(obj, "intc", &s->intc, sizeof(s->intc),
|
||||
TYPE_AW_A10_PIC);
|
||||
|
||||
+2
-1
@@ -81,7 +81,8 @@ static void cubieboard_init(MachineState *machine)
|
||||
|
||||
static void cubieboard_machine_init(MachineClass *mc)
|
||||
{
|
||||
mc->desc = "cubietech cubieboard";
|
||||
mc->desc = "cubietech cubieboard (Cortex-A9)";
|
||||
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9");
|
||||
mc->init = cubieboard_init;
|
||||
mc->block_default_type = IF_IDE;
|
||||
mc->units_per_default_bus = 1;
|
||||
|
||||
+2
-1
@@ -37,7 +37,8 @@ static void digic_init(Object *obj)
|
||||
int i;
|
||||
|
||||
object_initialize_child(obj, "cpu", &s->cpu, sizeof(s->cpu),
|
||||
"arm946-" TYPE_ARM_CPU, &error_abort, NULL);
|
||||
ARM_CPU_TYPE_NAME("arm946"),
|
||||
&error_abort, NULL);
|
||||
|
||||
for (i = 0; i < DIGIC4_NB_TIMERS; i++) {
|
||||
#define DIGIC_TIMER_NAME_MLEN 11
|
||||
|
||||
@@ -131,8 +131,8 @@ exynos4_boards_init_common(MachineState *machine,
|
||||
exynos4_boards_init_ram(s, get_system_memory(),
|
||||
exynos4_board_ram_size[board_type]);
|
||||
|
||||
object_initialize(&s->soc, sizeof(s->soc), TYPE_EXYNOS4210_SOC);
|
||||
qdev_set_parent_bus(DEVICE(&s->soc), sysbus_get_default());
|
||||
sysbus_init_child_obj(OBJECT(machine), "soc",
|
||||
&s->soc, sizeof(s->soc), TYPE_EXYNOS4210_SOC);
|
||||
object_property_set_bool(OBJECT(&s->soc), true, "realized",
|
||||
&error_fatal);
|
||||
|
||||
|
||||
+3
-1
@@ -36,7 +36,9 @@ static void fsl_imx25_init(Object *obj)
|
||||
FslIMX25State *s = FSL_IMX25(obj);
|
||||
int i;
|
||||
|
||||
object_initialize(&s->cpu, sizeof(s->cpu), "arm926-" TYPE_ARM_CPU);
|
||||
object_initialize_child(obj, "cpu", &s->cpu, sizeof(s->cpu),
|
||||
ARM_CPU_TYPE_NAME("arm926"),
|
||||
&error_abort, NULL);
|
||||
|
||||
sysbus_init_child_obj(obj, "avic", &s->avic, sizeof(s->avic),
|
||||
TYPE_IMX_AVIC);
|
||||
|
||||
+3
-1
@@ -33,7 +33,9 @@ static void fsl_imx31_init(Object *obj)
|
||||
FslIMX31State *s = FSL_IMX31(obj);
|
||||
int i;
|
||||
|
||||
object_initialize(&s->cpu, sizeof(s->cpu), "arm1136-" TYPE_ARM_CPU);
|
||||
object_initialize_child(obj, "cpu", &s->cpu, sizeof(s->cpu),
|
||||
ARM_CPU_TYPE_NAME("arm1136"),
|
||||
&error_abort, NULL);
|
||||
|
||||
sysbus_init_child_obj(obj, "avic", &s->avic, sizeof(s->avic),
|
||||
TYPE_IMX_AVIC);
|
||||
|
||||
+2
-1
@@ -43,7 +43,8 @@ static void fsl_imx6_init(Object *obj)
|
||||
for (i = 0; i < MIN(ms->smp.cpus, FSL_IMX6_NUM_CPUS); i++) {
|
||||
snprintf(name, NAME_SIZE, "cpu%d", i);
|
||||
object_initialize_child(obj, name, &s->cpu[i], sizeof(s->cpu[i]),
|
||||
"cortex-a9-" TYPE_ARM_CPU, &error_abort, NULL);
|
||||
ARM_CPU_TYPE_NAME("cortex-a9"),
|
||||
&error_abort, NULL);
|
||||
}
|
||||
|
||||
sysbus_init_child_obj(obj, "a9mpcore", &s->a9mpcore, sizeof(s->a9mpcore),
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ static void fsl_imx6ul_init(Object *obj)
|
||||
int i;
|
||||
|
||||
object_initialize_child(obj, "cpu0", &s->cpu, sizeof(s->cpu),
|
||||
"cortex-a7-" TYPE_ARM_CPU, &error_abort, NULL);
|
||||
ARM_CPU_TYPE_NAME("cortex-a7"), &error_abort, NULL);
|
||||
|
||||
/*
|
||||
* A7MPCORE
|
||||
|
||||
@@ -30,7 +30,6 @@ static void mcimx7d_sabre_init(MachineState *machine)
|
||||
{
|
||||
static struct arm_boot_info boot_info;
|
||||
MCIMX7Sabre *s = g_new0(MCIMX7Sabre, 1);
|
||||
Object *soc;
|
||||
int i;
|
||||
|
||||
if (machine->ram_size > FSL_IMX7_MMDC_SIZE) {
|
||||
@@ -49,10 +48,10 @@ static void mcimx7d_sabre_init(MachineState *machine)
|
||||
.nb_cpus = machine->smp.cpus,
|
||||
};
|
||||
|
||||
object_initialize(&s->soc, sizeof(s->soc), TYPE_FSL_IMX7);
|
||||
soc = OBJECT(&s->soc);
|
||||
object_property_add_child(OBJECT(machine), "soc", soc, &error_fatal);
|
||||
object_property_set_bool(soc, true, "realized", &error_fatal);
|
||||
object_initialize_child(OBJECT(machine), "soc",
|
||||
&s->soc, sizeof(s->soc),
|
||||
TYPE_FSL_IMX7, &error_fatal, NULL);
|
||||
object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_fatal);
|
||||
|
||||
memory_region_allocate_system_memory(&s->ram, NULL, "mcimx7d-sabre.ram",
|
||||
machine->ram_size);
|
||||
|
||||
+7
-8
@@ -427,10 +427,10 @@ static void mps2tz_common_init(MachineState *machine)
|
||||
/* The sec_resp_cfg output from the IoTKit must be split into multiple
|
||||
* lines, one for each of the PPCs we create here, plus one per MSC.
|
||||
*/
|
||||
object_initialize(&mms->sec_resp_splitter, sizeof(mms->sec_resp_splitter),
|
||||
TYPE_SPLIT_IRQ);
|
||||
object_property_add_child(OBJECT(machine), "sec-resp-splitter",
|
||||
OBJECT(&mms->sec_resp_splitter), &error_abort);
|
||||
object_initialize_child(OBJECT(machine), "sec-resp-splitter",
|
||||
&mms->sec_resp_splitter,
|
||||
sizeof(mms->sec_resp_splitter),
|
||||
TYPE_SPLIT_IRQ, &error_abort, NULL);
|
||||
object_property_set_int(OBJECT(&mms->sec_resp_splitter),
|
||||
ARRAY_SIZE(mms->ppc) + ARRAY_SIZE(mms->msc),
|
||||
"num-lines", &error_fatal);
|
||||
@@ -465,10 +465,9 @@ static void mps2tz_common_init(MachineState *machine)
|
||||
* Tx, Rx and "combined" IRQs are sent to the NVIC separately.
|
||||
* Create the OR gate for this.
|
||||
*/
|
||||
object_initialize(&mms->uart_irq_orgate, sizeof(mms->uart_irq_orgate),
|
||||
TYPE_OR_IRQ);
|
||||
object_property_add_child(OBJECT(mms), "uart-irq-orgate",
|
||||
OBJECT(&mms->uart_irq_orgate), &error_abort);
|
||||
object_initialize_child(OBJECT(mms), "uart-irq-orgate",
|
||||
&mms->uart_irq_orgate, sizeof(mms->uart_irq_orgate),
|
||||
TYPE_OR_IRQ, &error_abort, NULL);
|
||||
object_property_set_int(OBJECT(&mms->uart_irq_orgate), 10, "num-lines",
|
||||
&error_fatal);
|
||||
object_property_set_bool(OBJECT(&mms->uart_irq_orgate), true,
|
||||
|
||||
+5
-4
@@ -424,10 +424,11 @@ static void musca_init(MachineState *machine)
|
||||
* The sec_resp_cfg output from the SSE-200 must be split into multiple
|
||||
* lines, one for each of the PPCs we create here.
|
||||
*/
|
||||
object_initialize(&mms->sec_resp_splitter, sizeof(mms->sec_resp_splitter),
|
||||
TYPE_SPLIT_IRQ);
|
||||
object_property_add_child(OBJECT(machine), "sec-resp-splitter",
|
||||
OBJECT(&mms->sec_resp_splitter), &error_fatal);
|
||||
object_initialize_child(OBJECT(machine), "sec-resp-splitter",
|
||||
&mms->sec_resp_splitter,
|
||||
sizeof(mms->sec_resp_splitter),
|
||||
TYPE_SPLIT_IRQ, &error_fatal, NULL);
|
||||
|
||||
object_property_set_int(OBJECT(&mms->sec_resp_splitter),
|
||||
ARRAY_SIZE(mms->ppc), "num-lines", &error_fatal);
|
||||
object_property_set_bool(OBJECT(&mms->sec_resp_splitter), true,
|
||||
|
||||
@@ -381,6 +381,7 @@ typedef struct SMMUEventInfo {
|
||||
uint32_t sid;
|
||||
bool recorded;
|
||||
bool record_trans_faults;
|
||||
bool inval_ste_allowed;
|
||||
union {
|
||||
struct {
|
||||
uint32_t ssid;
|
||||
|
||||
+11
-7
@@ -320,6 +320,9 @@ static int decode_ste(SMMUv3State *s, SMMUTransCfg *cfg,
|
||||
uint32_t config;
|
||||
|
||||
if (!STE_VALID(ste)) {
|
||||
if (!event->inval_ste_allowed) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "invalid STE\n");
|
||||
}
|
||||
goto bad_ste;
|
||||
}
|
||||
|
||||
@@ -406,8 +409,10 @@ static int smmu_find_ste(SMMUv3State *s, uint32_t sid, STE *ste,
|
||||
|
||||
if (!span) {
|
||||
/* l2ptr is not valid */
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"invalid sid=%d (L1STD span=0)\n", sid);
|
||||
if (!event->inval_ste_allowed) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"invalid sid=%d (L1STD span=0)\n", sid);
|
||||
}
|
||||
event->type = SMMU_EVT_C_BAD_STREAMID;
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -602,7 +607,9 @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
|
||||
SMMUDevice *sdev = container_of(mr, SMMUDevice, iommu);
|
||||
SMMUv3State *s = sdev->smmu;
|
||||
uint32_t sid = smmu_get_sid(sdev);
|
||||
SMMUEventInfo event = {.type = SMMU_EVT_NONE, .sid = sid};
|
||||
SMMUEventInfo event = {.type = SMMU_EVT_NONE,
|
||||
.sid = sid,
|
||||
.inval_ste_allowed = false};
|
||||
SMMUPTWEventInfo ptw_info = {};
|
||||
SMMUTranslationStatus status;
|
||||
SMMUState *bs = ARM_SMMU(s);
|
||||
@@ -795,16 +802,13 @@ static void smmuv3_notify_iova(IOMMUMemoryRegion *mr,
|
||||
dma_addr_t iova)
|
||||
{
|
||||
SMMUDevice *sdev = container_of(mr, SMMUDevice, iommu);
|
||||
SMMUEventInfo event = {};
|
||||
SMMUEventInfo event = {.inval_ste_allowed = true};
|
||||
SMMUTransTableInfo *tt;
|
||||
SMMUTransCfg *cfg;
|
||||
IOMMUTLBEntry entry;
|
||||
|
||||
cfg = smmuv3_get_config(sdev, &event);
|
||||
if (!cfg) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s error decoding the configuration for iommu mr=%s\n",
|
||||
__func__, mr->parent_obj.name);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -196,8 +196,8 @@ static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s,
|
||||
|
||||
object_initialize_child(OBJECT(&s->rpu_cluster), "rpu-cpu[*]",
|
||||
&s->rpu_cpu[i], sizeof(s->rpu_cpu[i]),
|
||||
"cortex-r5f-" TYPE_ARM_CPU, &error_abort,
|
||||
NULL);
|
||||
ARM_CPU_TYPE_NAME("cortex-r5f"),
|
||||
&error_abort, NULL);
|
||||
|
||||
name = object_get_canonical_path_component(OBJECT(&s->rpu_cpu[i]));
|
||||
if (strcmp(name, boot_cpu)) {
|
||||
@@ -237,8 +237,8 @@ static void xlnx_zynqmp_init(Object *obj)
|
||||
for (i = 0; i < num_apus; i++) {
|
||||
object_initialize_child(OBJECT(&s->apu_cluster), "apu-cpu[*]",
|
||||
&s->apu_cpu[i], sizeof(s->apu_cpu[i]),
|
||||
"cortex-a53-" TYPE_ARM_CPU, &error_abort,
|
||||
NULL);
|
||||
ARM_CPU_TYPE_NAME("cortex-a53"),
|
||||
&error_abort, NULL);
|
||||
}
|
||||
|
||||
sysbus_init_child_obj(obj, "gic", &s->gic, sizeof(s->gic),
|
||||
|
||||
@@ -566,14 +566,14 @@ static void xilinx_axidma_init(Object *obj)
|
||||
XilinxAXIDMA *s = XILINX_AXI_DMA(obj);
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
|
||||
|
||||
object_initialize(&s->rx_data_dev, sizeof(s->rx_data_dev),
|
||||
TYPE_XILINX_AXI_DMA_DATA_STREAM);
|
||||
object_initialize(&s->rx_control_dev, sizeof(s->rx_control_dev),
|
||||
TYPE_XILINX_AXI_DMA_CONTROL_STREAM);
|
||||
object_property_add_child(OBJECT(s), "axistream-connected-target",
|
||||
(Object *)&s->rx_data_dev, &error_abort);
|
||||
object_property_add_child(OBJECT(s), "axistream-control-connected-target",
|
||||
(Object *)&s->rx_control_dev, &error_abort);
|
||||
object_initialize_child(OBJECT(s), "axistream-connected-target",
|
||||
&s->rx_data_dev, sizeof(s->rx_data_dev),
|
||||
TYPE_XILINX_AXI_DMA_DATA_STREAM, &error_abort,
|
||||
NULL);
|
||||
object_initialize_child(OBJECT(s), "axistream-control-connected-target",
|
||||
&s->rx_control_dev, sizeof(s->rx_control_dev),
|
||||
TYPE_XILINX_AXI_DMA_CONTROL_STREAM, &error_abort,
|
||||
NULL);
|
||||
|
||||
sysbus_init_irq(sbd, &s->streams[0].irq);
|
||||
sysbus_init_irq(sbd, &s->streams[1].irq);
|
||||
|
||||
@@ -994,15 +994,14 @@ static void xilinx_enet_init(Object *obj)
|
||||
XilinxAXIEnet *s = XILINX_AXI_ENET(obj);
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
|
||||
|
||||
object_initialize(&s->rx_data_dev, sizeof(s->rx_data_dev),
|
||||
TYPE_XILINX_AXI_ENET_DATA_STREAM);
|
||||
object_initialize(&s->rx_control_dev, sizeof(s->rx_control_dev),
|
||||
TYPE_XILINX_AXI_ENET_CONTROL_STREAM);
|
||||
object_property_add_child(OBJECT(s), "axistream-connected-target",
|
||||
(Object *)&s->rx_data_dev, &error_abort);
|
||||
object_property_add_child(OBJECT(s), "axistream-control-connected-target",
|
||||
(Object *)&s->rx_control_dev, &error_abort);
|
||||
|
||||
object_initialize_child(OBJECT(s), "axistream-connected-target",
|
||||
&s->rx_data_dev, sizeof(s->rx_data_dev),
|
||||
TYPE_XILINX_AXI_ENET_DATA_STREAM, &error_abort,
|
||||
NULL);
|
||||
object_initialize_child(OBJECT(s), "axistream-control-connected-target",
|
||||
&s->rx_control_dev, sizeof(s->rx_control_dev),
|
||||
TYPE_XILINX_AXI_ENET_CONTROL_STREAM, &error_abort,
|
||||
NULL);
|
||||
sysbus_init_irq(sbd, &s->irq);
|
||||
|
||||
memory_region_init_io(&s->iomem, OBJECT(s), &enet_ops, s, "enet", 0x40000);
|
||||
|
||||
+16
-1
@@ -44,6 +44,13 @@ enum timer_ctrl_op {
|
||||
op_pulse_enable
|
||||
};
|
||||
|
||||
/*
|
||||
* Minimum value of the reload register to filter out short period
|
||||
* timers which have a noticeable impact in emulation. 5us should be
|
||||
* enough, use 20us for "safety".
|
||||
*/
|
||||
#define TIMER_MIN_NS (20 * SCALE_US)
|
||||
|
||||
/**
|
||||
* Avoid mutual references between AspeedTimerCtrlState and AspeedTimer
|
||||
* structs, as it's a waste of memory. The ptimer BH callback needs to know
|
||||
@@ -98,6 +105,14 @@ static inline uint32_t calculate_ticks(struct AspeedTimer *t, uint64_t now_ns)
|
||||
return t->reload - MIN(t->reload, ticks);
|
||||
}
|
||||
|
||||
static uint32_t calculate_min_ticks(AspeedTimer *t, uint32_t value)
|
||||
{
|
||||
uint32_t rate = calculate_rate(t);
|
||||
uint32_t min_ticks = muldiv64(TIMER_MIN_NS, rate, NANOSECONDS_PER_SECOND);
|
||||
|
||||
return value < min_ticks ? min_ticks : value;
|
||||
}
|
||||
|
||||
static inline uint64_t calculate_time(struct AspeedTimer *t, uint32_t ticks)
|
||||
{
|
||||
uint64_t delta_ns;
|
||||
@@ -261,7 +276,7 @@ static void aspeed_timer_set_value(AspeedTimerCtrlState *s, int timer, int reg,
|
||||
switch (reg) {
|
||||
case TIMER_REG_RELOAD:
|
||||
old_reload = t->reload;
|
||||
t->reload = value;
|
||||
t->reload = calculate_min_ticks(t, value);
|
||||
|
||||
/* If the reload value was not previously set, or zero, and
|
||||
* the current value is valid, try to start the timer if it is
|
||||
|
||||
@@ -231,7 +231,7 @@ typedef struct CPUTLB { } CPUTLB;
|
||||
#endif /* !CONFIG_USER_ONLY && CONFIG_TCG */
|
||||
|
||||
/*
|
||||
* This structure must be placed in ArchCPU immedately
|
||||
* This structure must be placed in ArchCPU immediately
|
||||
* before CPUArchState, as a field named "neg".
|
||||
*/
|
||||
typedef struct CPUNegativeOffsetState {
|
||||
|
||||
@@ -1086,16 +1086,6 @@ void memory_region_register_iommu_notifier(MemoryRegion *mr,
|
||||
*/
|
||||
void memory_region_iommu_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier *n);
|
||||
|
||||
/**
|
||||
* memory_region_iommu_replay_all: replay existing IOMMU translations
|
||||
* to all the notifiers registered.
|
||||
*
|
||||
* Note: this is not related to record-and-replay functionality.
|
||||
*
|
||||
* @iommu_mr: the memory region to observe
|
||||
*/
|
||||
void memory_region_iommu_replay_all(IOMMUMemoryRegion *iommu_mr);
|
||||
|
||||
/**
|
||||
* memory_region_unregister_iommu_notifier: unregister a notifier for
|
||||
* changes to IOMMU translation entries.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user