Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
        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,
    };