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+
12851308void 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}
0 commit comments