X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/85bc8ca6a317e9ce0a3ce1bf27a31df11f44ac47..ce91287c57fa75fe7f4e8613f969fa1c2234aa8f:/aseg/firstrun.c diff --git a/aseg/firstrun.c b/aseg/firstrun.c index 9977d14..2ca07e0 100644 --- a/aseg/firstrun.c +++ b/aseg/firstrun.c @@ -1,20 +1,46 @@ #include #include +#include +#include +#include +#include "vga-overlay.h" +#include + +extern int _bss, _bssend; + +extern void timer_handler(smi_event_t ev); +extern void kbc_handler(smi_event_t ev); +extern void gbl_rls_handler(smi_event_t ev); + +int bother_3c905(pci_dev_t *dev) +{ + if (dev->vid == 0x10B7 || dev->did == 0x9200) + { + int bar; + + outputf("Found a 3c905 to bother"); + pci_write16(dev->bus, dev->dev, dev->fn, 0x04, 0x00); + + for (bar = 0; bar < 6; bar++) + if (dev->bars[bar].type != PCI_BAR_NONE) + pci_write32(dev->bus, dev->dev, dev->fn, 0x10 + bar*4, 0); + + return 1; + } + return 0; +} void __firstrun_start() { -/* - puts("Current USB state is: "); - puthex(pci_read16(0, 31, 2, 0xC0)); - puts(" "); - puthex(pci_read16(0, 31, 4, 0xC0)); - puts("\n"); - puts("Current SMI state is: "); - puthex(inl(0x830)); - puts("\n"); - puts("Current SMRAMC state is: "); - puthex(pci_read8(0, 0, 0, 0x70)); - puts("\n"); -*/ + unsigned char *bp; + smram_state_t smram; + + smram = smram_save_state(); + smram_tseg_set_state(SMRAM_TSEG_OPEN); + + for (bp = (void *)&_bss; (void *)bp < (void *)&_bssend; bp++) + *bp = 0; + + outputf("NetWatch running"); /* Try really hard to shut up USB_LEGKEY. */ pci_write16(0, 31, 2, 0xC0, pci_read16(0, 31, 2, 0xC0)); @@ -23,7 +49,21 @@ void __firstrun_start() { pci_write16(0, 31, 4, 0xC0, 0); /* Turn on the SMIs we want */ - outb(0x830, inb(0x830) | 0x40); + smi_disable(); + + pci_probe(bother_3c905); + + smi_register_handler(SMI_EVENT_FAST_TIMER, timer_handler); + smi_enable_event(SMI_EVENT_FAST_TIMER); + + smi_register_handler(SMI_EVENT_DEVTRAP_KBC, kbc_handler); + smi_enable_event(SMI_EVENT_DEVTRAP_KBC); + + smi_register_handler(SMI_EVENT_GBL_RLS, gbl_rls_handler); + smi_enable_event(SMI_EVENT_GBL_RLS); + smi_enable(); + + smram_restore_state(smram); }