int pckbd_cnattach(pckbport_tag_t kbctag, int kbcslot) { int res; u_char cmd[1]; res = pckbd_init(&pckbd_consdata, kbctag, kbcslot, 1); #if 0 /* we allow the console to be attached if no keyboard is present */ if (res) return res; #endif /* Just to be sure. */ cmd[0] = KBC_ENABLE; res = pckbport_poll_cmd(kbctag, kbcslot, cmd, 1, 0, 0, 0); #if 0 if (res) return res; #endif wskbd_cnattach(&pckbd_consops, &pckbd_consdata, &pckbd_keymapdata); return 0; }
void pckbdattach(device_t parent, device_t self, void *aux) { struct pckbd_softc *sc = device_private(self); struct pckbport_attach_args *pa = aux; struct wskbddev_attach_args a; int isconsole; u_char cmd[1]; aprint_naive("\n"); aprint_normal("\n"); sc->sc_dev = self; isconsole = pckbd_is_console(pa->pa_tag, pa->pa_slot); if (isconsole) { sc->id = &pckbd_consdata; /* * Some keyboards are not enabled after a reset, * so make sure it is enabled now. */ cmd[0] = KBC_ENABLE; (void) pckbport_poll_cmd(sc->id->t_kbctag, sc->id->t_kbcslot, cmd, 1, 0, 0, 0); sc->sc_enabled = 1; } else { sc->id = malloc(sizeof(struct pckbd_internal), M_DEVBUF, M_WAITOK); (void) pckbd_init(sc->id, pa->pa_tag, pa->pa_slot, 0); /* no interrupts until enabled */ cmd[0] = KBC_DISABLE; (void) pckbport_poll_cmd(sc->id->t_kbctag, sc->id->t_kbcslot, cmd, 1, 0, 0, 0); sc->sc_enabled = 0; } sc->id->t_sc = sc; pckbport_set_inputhandler(sc->id->t_kbctag, sc->id->t_kbcslot, pckbd_input, sc, device_xname(sc->sc_dev)); a.console = isconsole; a.keymap = &pckbd_keymapdata; a.accessops = &pckbd_accessops; a.accesscookie = sc; if (!pmf_device_register(self, pckbd_suspend, pckbd_resume)) aprint_error_dev(self, "couldn't establish power handler\n"); /* * Attach the wskbd, saving a handle to it. * XXX XXX XXX */ sc->sc_wskbddev = config_found_ia(self, "wskbddev", &a, wskbddevprint); }
void pckbdattach(struct device *parent, struct device *self, void *aux) { struct pckbd_softc *sc = (void *)self; struct pckbport_attach_args *pa = aux; struct wskbddev_attach_args a; int isconsole; u_char cmd[1]; printf("\n"); isconsole = pckbd_is_console(pa->pa_tag, pa->pa_slot); if (isconsole) { sc->id = &pckbd_consdata; /* * Some keyboards are not enabled after a reset, * so make sure it is enabled now. */ cmd[0] = KBC_ENABLE; (void) pckbport_poll_cmd(sc->id->t_kbctag, sc->id->t_kbcslot, cmd, 1, 0, 0, 0); sc->sc_enabled = 1; } else { sc->id = malloc(sizeof(struct pckbd_internal), M_DEVBUF, M_WAITOK); (void) pckbd_init(sc->id, pa->pa_tag, pa->pa_slot, 0); /* no interrupts until enabled */ cmd[0] = KBC_DISABLE; (void) pckbport_poll_cmd(sc->id->t_kbctag, sc->id->t_kbcslot, cmd, 1, 0, 0, 0); sc->sc_enabled = 0; } sc->id->t_sc = sc; pckbport_set_inputhandler(sc->id->t_kbctag, sc->id->t_kbcslot, pckbd_input, sc, sc->sc_dev.dv_xname); a.console = isconsole; a.keymap = &pckbd_keymapdata; a.accessops = &pckbd_accessops; a.accesscookie = sc; /* * Attach the wskbd, saving a handle to it. * XXX XXX XXX */ sc->sc_wskbddev = config_found(self, &a, wskbddevprint); }
void init_x86(const char *karg) { enum { code = GATE_PRESENT | GATE_TYPE_RX, ucode = code | GATE_DPL3, data = GATE_PRESENT | GATE_TYPE_RW, udata = data | GATE_DPL3, attr = GATE_PAGEGRAN | GATE_OP32, tss0 = GATE_PRESENT | GATE_TYPE_TASK, intrpt_attr = GATE_PRESENT | GATE_TYPE_INTRPT, trap_attr = GATE_PRESENT | GATE_TYPE_TRAP }; int i = 0; __kernarg = karg; if (1) for (i = 0; i < 255 && *karg; karg++, i++) { kernarg[i] = *karg; } kernarg[i] = 0; kargs_init(); // Ustawienie GDT mem_zero(&p_gdt, sizeof(p_gdt)); mem_zero(&p_tss0, sizeof(p_tss0)); setgdt(SEL_CODE, 0x0, 0xfffff, code, attr); setgdt(SEL_DATA, 0x0, 0xfffff, data, attr); setgdt(SEL_UCODE, 0x0, 0xfffff, ucode, attr); setgdt(SEL_UDATA, 0x0, 0xfffff, udata, attr); setgdt(SEL_TSS0, (uintptr_t)&p_tss0, sizeof(p_tss0), tss0, 0); p_tss0.tss_io = 0; p_tss0.tss_ss0 = 0x10; // p_tss0.tss_cs=0x8; // p_tss0.tss_ds=p_tss0.tss_es=p_tss0.tss_fs=p_tss0.tss_gs=0x10; mem_zero(&p_gdtr, sizeof(p_gdtr)); p_gdtr.base = &p_gdt; p_gdtr.limit = sizeof(p_gdt) -1; cpu_gdt_load(&p_gdtr); cpu_tr_load(SEL_MK(SEL_TSS0, SEL_DPL3)); extern void megaloop(void); // Ustawienie IDT for (i = 0; i < 0x100; i++) { setidt(i, SEL_MK(SEL_CODE, SEL_DPL0), (uintptr_t)_unhnd_intrpt, intrpt_attr); } for (i = 0; i < 0x20; i++) { setidt(i, SEL_MK(SEL_CODE, SEL_DPL0), (uintptr_t)trap_table[i], trap_attr); } for (i = 0; i <= 23; i++) { setidt(i+0x20, SEL_MK(SEL_CODE, SEL_DPL0), irq_table[i], intrpt_attr); } setidt(INTRPT_SYSCALL, SEL_MK(SEL_CODE, SEL_DPL0), (uintptr_t)_intrpt_syscall, intrpt_attr | GATE_DPL3); mem_zero(&p_idtr, sizeof(p_idtr)); p_idtr.base = &p_idt; p_idtr.limit = sizeof(p_idt)-1; cpu_idt_load(&p_idtr); i8259a_init(); i8254_init(); pckbd_init(); vm_low_init(); video_init(); bus_isa_init(); bus_pci_init(); irq_enable(); _cpu_info(); }