static int handle_vsysreg_fault(struct device* d, vm_t* vm, fault_t* fault) { struct sysreg_priv* sysreg_data = (struct sysreg_priv*)d->priv; volatile uint32_t *reg; int offset; /* Gather fault information */ offset = fault_get_address(fault) - d->pstart; reg = (uint32_t*)(sysreg_data->regs + offset); /* Handle the fault */ reg = (volatile uint32_t*)(sysreg_data->regs + offset); if (fault_is_read(fault)) { fault_set_data(fault, *reg); DSYSREG("[%s] pc0x%x| r0x%x:0x%x\n", d->name, fault_get_ctx(fault)->pc, fault_get_address(fault), fault_get_data(fault)); } else { DSYSREG("[%s] pc0x%x| w0x%x:0x%x\n", d->name, fault_get_ctx(fault)->pc, fault_get_address(fault), fault_get_data(fault)); *reg = fault_emulate(fault, *reg); } return advance_fault(fault); }
printf("Failed to set boot args\n"); return -1; } err = vm_start(vm); if (err) { printf("Failed to restart linux\n"); return -1; } printf("VM restarted\n"); return 0; #endif } static int pwmsig_device_fault_handler(struct device* d UNUSED, vm_t* vm, fault_t* fault){ uint32_t data = fault_get_data(fault); ignore_fault(fault); // printf("IN VM, GOT PWM SIGNAL 0x%x\n", data); // fflush(stdout); //pwm_vmsig(data); return 0; } struct device pwmsig_dev = { .devid = DEV_CUSTOM, .name = "NICTAcopter signal", .pstart = 0x30000000, .size = 0x1000, .handle_page_fault = &pwmsig_device_fault_handler, .priv = NULL, };