Пример #1
0
static void
htif_handle_entry(struct htif_softc *sc)
{
    uint64_t entry;
    uint8_t devcmd;
    uint8_t devid;

    entry = machine_command(ECALL_HTIF_GET_ENTRY, 0);
    while (entry) {
        devid = HTIF_DEV_ID(entry);
        devcmd = HTIF_DEV_CMD(entry);

        if (devcmd == HTIF_CMD_IDENTIFY) {
            /* Enumeration interrupt */
            if (devid == sc->identify_id)
                sc->identify_done = 1;
        } else {
            /* Device interrupt */
            if (intrs[devid].func != NULL)
                intrs[devid].func(intrs[devid].arg, entry);
        }

        entry = machine_command(ECALL_HTIF_GET_ENTRY, 0);
    }
}
Пример #2
0
void
identify_cpu(void)
{
	const struct cpu_parts *cpu_partsp;
	uint32_t part_id;
	uint32_t impl_id;
	uint64_t mimpid;
	uint64_t misa;
	u_int cpu;
	size_t i;

	cpu_partsp = NULL;

	mimpid = machine_command(ECALL_MIMPID_GET, 0);
	misa = machine_command(ECALL_MCPUID_GET, 0);

	cpu = PCPU_GET(cpuid);

	impl_id	= CPU_IMPL(mimpid);
	for (i = 0; i < nitems(cpu_implementers); i++) {
		if (impl_id == cpu_implementers[i].impl_id ||
		    cpu_implementers[i].impl_id == 0) {
			cpu_desc[cpu].cpu_impl = impl_id;
			cpu_desc[cpu].cpu_impl_name = cpu_implementers[i].impl_name;
			cpu_partsp = cpu_parts_std;
			break;
		}
	}

	part_id = CPU_PART(misa);
	for (i = 0; &cpu_partsp[i] != NULL; i++) {
		if (part_id == cpu_partsp[i].part_id ||
		    cpu_partsp[i].part_id == -1) {
			cpu_desc[cpu].cpu_part_num = part_id;
			cpu_desc[cpu].cpu_part_name = cpu_partsp[i].part_name;
			break;
		}
	}

	/* Print details for boot CPU or if we want verbose output */
	if (cpu == 0 || bootverbose) {
		printf("CPU(%d): %s %s\n", cpu,
		    cpu_desc[cpu].cpu_impl_name,
		    cpu_desc[cpu].cpu_part_name);
	}
}
Пример #3
0
uint64_t
htif_command(uint64_t arg)
{

    return (machine_command(ECALL_HTIF_CMD, arg));
}