|
@@ -181,8 +181,10 @@ void riscv_aplic_set_kvm_msicfgaddr(RISCVAPLICState *aplic, hwaddr addr)
|
|
{
|
|
{
|
|
#ifdef CONFIG_KVM
|
|
#ifdef CONFIG_KVM
|
|
if (riscv_use_emulated_aplic(aplic->msimode)) {
|
|
if (riscv_use_emulated_aplic(aplic->msimode)) {
|
|
|
|
+ addr >>= APLIC_xMSICFGADDR_PPN_SHIFT;
|
|
aplic->kvm_msicfgaddr = extract64(addr, 0, 32);
|
|
aplic->kvm_msicfgaddr = extract64(addr, 0, 32);
|
|
- aplic->kvm_msicfgaddrH = extract64(addr, 32, 32);
|
|
|
|
|
|
+ aplic->kvm_msicfgaddrH = extract64(addr, 32, 32) &
|
|
|
|
+ APLIC_xMSICFGADDRH_VALID_MASK;
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
@@ -403,12 +405,17 @@ static void riscv_aplic_msi_send(RISCVAPLICState *aplic,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (aplic->mmode) {
|
|
|
|
- msicfgaddr = aplic_m->mmsicfgaddr;
|
|
|
|
- msicfgaddrH = aplic_m->mmsicfgaddrH;
|
|
|
|
|
|
+ if (aplic->kvm_splitmode) {
|
|
|
|
+ msicfgaddr = aplic->kvm_msicfgaddr;
|
|
|
|
+ msicfgaddrH = ((uint64_t)aplic->kvm_msicfgaddrH << 32);
|
|
} else {
|
|
} else {
|
|
- msicfgaddr = aplic_m->smsicfgaddr;
|
|
|
|
- msicfgaddrH = aplic_m->smsicfgaddrH;
|
|
|
|
|
|
+ if (aplic->mmode) {
|
|
|
|
+ msicfgaddr = aplic_m->mmsicfgaddr;
|
|
|
|
+ msicfgaddrH = aplic_m->mmsicfgaddrH;
|
|
|
|
+ } else {
|
|
|
|
+ msicfgaddr = aplic_m->smsicfgaddr;
|
|
|
|
+ msicfgaddrH = aplic_m->smsicfgaddrH;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
lhxs = (msicfgaddrH >> APLIC_xMSICFGADDRH_LHXS_SHIFT) &
|
|
lhxs = (msicfgaddrH >> APLIC_xMSICFGADDRH_LHXS_SHIFT) &
|
|
@@ -431,11 +438,6 @@ static void riscv_aplic_msi_send(RISCVAPLICState *aplic,
|
|
addr |= (uint64_t)(guest_idx & APLIC_xMSICFGADDR_PPN_HART(lhxs));
|
|
addr |= (uint64_t)(guest_idx & APLIC_xMSICFGADDR_PPN_HART(lhxs));
|
|
addr <<= APLIC_xMSICFGADDR_PPN_SHIFT;
|
|
addr <<= APLIC_xMSICFGADDR_PPN_SHIFT;
|
|
|
|
|
|
- if (aplic->kvm_splitmode) {
|
|
|
|
- addr |= aplic->kvm_msicfgaddr;
|
|
|
|
- addr |= ((uint64_t)aplic->kvm_msicfgaddrH << 32);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
address_space_stl_le(&address_space_memory, addr,
|
|
address_space_stl_le(&address_space_memory, addr,
|
|
eiid, MEMTXATTRS_UNSPECIFIED, &result);
|
|
eiid, MEMTXATTRS_UNSPECIFIED, &result);
|
|
if (result != MEMTX_OK) {
|
|
if (result != MEMTX_OK) {
|