Skip to content

Commit d7c6e50

Browse files
committed
feat(riscv): add vplic/vaplic reset functions
Signed-off-by: Jose Martins <[email protected]>
1 parent 38371db commit d7c6e50

File tree

4 files changed

+64
-0
lines changed

4 files changed

+64
-0
lines changed

src/arch/riscv/irqc/aia/inc/vaplic.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,16 @@ static inline void virqc_inject(vcpu_t* vcpu, irqid_t id)
8686
vaplic_inject(vcpu, id);
8787
}
8888

89+
/**
90+
* @brief Resets the state of the virtual aplic
91+
*
92+
* @param vm Virtual Machine of the target vaplic
93+
*/
94+
void vaplic_reset(struct vm* vm);
95+
96+
static inline void virqc_reset(struct vm* vm)
97+
{
98+
vaplic_reset(vm);
99+
}
100+
89101
#endif // VAPLIC_H

src/arch/riscv/irqc/aia/vaplic.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <mem.h>
1111
#include <interrupts.h>
1212
#include <arch/csrs.h>
13+
#include <string.h>
1314

1415
#define APLIC_MIN_PRIO (0xFF)
1516
#define UPDATE_ALL_HARTS (~0U)
@@ -1282,6 +1283,28 @@ static bool vaplic_idc_emul_handler(struct emul_access* acc)
12821283
return true;
12831284
}
12841285

1286+
void vaplic_reset(struct vm* vm)
1287+
{
1288+
memset(vm->arch.vaplic.srccfg, 0, sizeof(vm->arch.vaplic.srccfg));
1289+
memset(vm->arch.vaplic.ip, 0, sizeof(vm->arch.vaplic.ip));
1290+
memset(vm->arch.vaplic.ie, 0, sizeof(vm->arch.vaplic.ie));
1291+
memset(vm->arch.vaplic.target, 0, sizeof(vm->arch.vaplic.target));
1292+
memset(vm->arch.vaplic.idelivery, 0, sizeof(vm->arch.vaplic.idelivery));
1293+
memset(vm->arch.vaplic.iforce, 0, sizeof(vm->arch.vaplic.iforce));
1294+
memset(vm->arch.vaplic.ithreshold, 0, sizeof(vm->arch.vaplic.ithreshold));
1295+
memset(vm->arch.vaplic.topi_claimi, 0, sizeof(vm->arch.vaplic.topi_claimi));
1296+
1297+
for (irqid_t id = 1; id <= APLIC_MAX_INTERRUPTS; id++) {
1298+
if (bitmap_get(vm->arch.vaplic.hw, id)) {
1299+
aplic_clr_enbl(id);
1300+
aplic_clr_pend(id);
1301+
aplic_set_sourcecfg(id, APLIC_SOURCECFG_SM_INACTIVE);
1302+
aplic_set_target_prio(id, APLIC_TARGET_MIN_PRIO);
1303+
aplic_set_target_hart(id, 0);
1304+
}
1305+
}
1306+
}
1307+
12851308
void vaplic_init(struct vm* vm, const union vm_irqc_dscrp* vm_irqc_dscrp)
12861309
{
12871310
if (cpu()->id == vm->master) {
@@ -1301,5 +1324,7 @@ void vaplic_init(struct vm* vm, const union vm_irqc_dscrp* vm_irqc_dscrp)
13011324
.handler = vaplic_idc_emul_handler };
13021325

13031326
vm_emul_add_mem(vm, &vm->arch.vaplic.aplic_idc_emul);
1327+
1328+
vaplic_reset(vm);
13041329
}
13051330
}

src/arch/riscv/irqc/plic/inc/vplic.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ union vm_irqc_dscrp;
3131
void vplic_init(struct vm* vm, const union vm_irqc_dscrp* vm_irqc_dscrp);
3232
void vplic_inject(struct vcpu* vcpu, irqid_t id);
3333
void vplic_set_hw(struct vm* vm, irqid_t id);
34+
void vplic_reset(struct vm* vm);
3435

3536
static inline void virqc_init(struct vm* vm, const union vm_irqc_dscrp* vm_irqc_dscrp)
3637
{
@@ -43,4 +44,9 @@ static inline void virqc_inject(vcpu_t* vcpu, irqid_t id)
4344
vplic_inject(vcpu, id);
4445
}
4546

47+
static inline void virqc_reset(struct vm* vm)
48+
{
49+
vplic_reset(vm);
50+
}
51+
4652
#endif //__VPLIC_H__

src/arch/riscv/irqc/plic/vplic.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <vm.h>
1111
#include <interrupts.h>
1212
#include <arch/csrs.h>
13+
#include <string.h>
1314

1415
static ssize_t vplic_vcntxt_to_pcntxt(struct vcpu* vcpu, size_t vcntxt_id)
1516
{
@@ -369,6 +370,24 @@ static bool vplic_hart_emul_handler(struct emul_access* acc)
369370
return true;
370371
}
371372

373+
void vplic_reset(struct vm* vm)
374+
{
375+
memset(vm->arch.vplic.pend, 0, sizeof(vm->arch.vplic.pend));
376+
memset(vm->arch.vplic.act, 0, sizeof(vm->arch.vplic.act));
377+
memset(vm->arch.vplic.prio, 0, sizeof(vm->arch.vplic.prio));
378+
memset(vm->arch.vplic.enbl, 0, sizeof(vm->arch.vplic.enbl));
379+
memset(vm->arch.vplic.pend, 0, sizeof(vm->arch.vplic.pend));
380+
381+
for (irqid_t id = 1; id <= PLIC_IMPL_INTERRUPTS; id++) {
382+
if (vm->arch.vplic.hw) {
383+
plic_set_prio(id, 0);
384+
for (size_t j = 1; j < PLIC_PLAT_CNTXT_NUM; j += 2) {
385+
plic_set_enbl(j, id, false);
386+
}
387+
}
388+
}
389+
}
390+
372391
void vplic_init(struct vm* vm, const union vm_irqc_dscrp* vm_irqc_dscrp)
373392
{
374393
if (cpu()->id == vm->master) {
@@ -387,5 +406,7 @@ void vplic_init(struct vm* vm, const union vm_irqc_dscrp* vm_irqc_dscrp)
387406

388407
/* assumes 2 contexts per hart */
389408
vm->arch.vplic.cntxt_num = vm->cpu_num * 2;
409+
410+
vplic_reset(vm);
390411
}
391412
}

0 commit comments

Comments
 (0)