From 31be35cda26f033fe62db673a8a973f0b15c9de7 Mon Sep 17 00:00:00 2001 From: Joshua Wise Date: Thu, 11 Sep 2008 00:27:59 -0400 Subject: [PATCH] Have a log console -- needs to be refactored --- aseg/Makefile | 8 ++- aseg/counter.c | 85 ++++++++++++++++++++------- grubload/Makefile | 2 +- {grubload => include}/console-ext.h | 0 {grubload => include}/console.h | 0 {grubload => include}/minilib.h | 0 {grubload => include}/video_defines.h | 0 {grubload => lib}/console.c | 0 {grubload => lib}/minilib.c | 21 ++++++- 9 files changed, 88 insertions(+), 28 deletions(-) rename {grubload => include}/console-ext.h (100%) rename {grubload => include}/console.h (100%) rename {grubload => include}/minilib.h (100%) rename {grubload => include}/video_defines.h (100%) rename {grubload => lib}/console.c (100%) rename {grubload => lib}/minilib.c (79%) diff --git a/aseg/Makefile b/aseg/Makefile index 5676489..28a09de 100644 --- a/aseg/Makefile +++ b/aseg/Makefile @@ -1,4 +1,6 @@ -CFLAGS=-I../include +CC=gcc +CFLAGS=-I../include -nostdlib -nostdinc -fno-builtin +OBJS=counter.o ../pci/pci-smm.o ../lib/minilib.o ../lib/console.o all: aseg.elf @@ -8,5 +10,5 @@ aseg.bin: aseg.asm aseg.o: aseg.bin objcopy -I binary -B i386 -O elf32-i386 aseg.bin aseg.o -aseg.elf: aseg.o aseg.lds counter.o ../pci/pci-smm.o - ld -o aseg.elf -T aseg.lds counter.o ../pci/pci-smm.o +aseg.elf: aseg.lds aseg.o $(OBJS) + ld -o aseg.elf -T aseg.lds $(OBJS) diff --git a/aseg/counter.c b/aseg/counter.c index 8f807aa..7fe4cef 100644 --- a/aseg/counter.c +++ b/aseg/counter.c @@ -1,21 +1,11 @@ #include +#include -char counter = 0; +unsigned int counter = 0; unsigned long pcisave; unsigned char vgasave; unsigned char thestr[512]; - -void memcpy(char *dst, char *src, int c) -{ - while (c--) - *(dst++) = *(src++); -} - -void strcpy(char *dst, char *src) -{ - while (*src) - *(dst++) = *(src++); -} +unsigned char logents[4][41] = {0}; unsigned char vgaread(unsigned char idx) { @@ -23,37 +13,88 @@ unsigned char vgaread(unsigned char idx) inb(0x3D5); } -void strblit(char *src) +void strblit(char *src, int r, int c) { - char *destp = (char*)(0xB8000UL | (((unsigned int)vgaread(0xC)) << 9) | (((unsigned int)vgaread(0xD)) << 1)); + char *destp = (char*)(0xB8000UL | (((unsigned int)vgaread(0xC)) << 9) | (((unsigned int)vgaread(0xD)) << 1)) + r*80*2 + c*2; + unsigned char smramc; + + smramc = pci_read8(0, 0, 0, 0x70); + pci_write8(0, 0, 0, 0x70, (smramc & 0xF3) | 0x08); while (*src) { *(destp++) = *(src++); *(destp++) = 0x1F; } + pci_write8(0, 0, 0, 0x70, smramc); +} + +void outlog() +{ + int y, x; + unsigned char smramc; + unsigned char *basep = (char*)(0xB8000UL | (((unsigned int)vgaread(0xC)) << 9) | (((unsigned int)vgaread(0xD)) << 1)); + + smramc = pci_read8(0, 0, 0, 0x70); + pci_write8(0, 0, 0, 0x70, (smramc & 0xF3) | 0x08); + for (y = 0; y < 4; y++) + for (x = 40; x < 80; x++) + { + basep[y*80*2+x*2] = ' '; + basep[y*80*2+x*2+1] = 0x1F; + } + pci_write8(0, 0, 0, 0x70, smramc); + + for (y = 0; y < 4; y++) + strblit(logents[y], y, 40); + +} + +void dolog(char *s) +{ + memmove(logents[0], logents[1], sizeof(logents[0])*3); + strcpy(logents[3], s); } void __start (void) { unsigned char smramc; + static int first = 1; pcisave = inl(0xCF8); vgasave = inb(0x3D4); + + if (first) + { + first = 0; + dolog("NetWatch running..."); + } counter++; - outb(0x80, counter); + outb(0x80, (counter & 0xFF)); - strcpy(thestr, "15-412!"); + strcpy(thestr, "15-412! xxxxxxxx xxxxxxxx"); + tohex(thestr + 8, inl(0x0834)); + tohex(thestr + 17, counter); + strblit(thestr, 0, 0); - smramc = pci_read8(0, 0, 0, 0x70); - pci_write8(0, 0, 0, 0x70, (smramc & 0xF3) | 0x08); - strblit(thestr); - pci_write8(0, 0, 0, 0x70, smramc); + if (inl(0x834) & 0x20) + dolog("Warning: unhandled APM access"); + if (inl(0x834) & 0x4000) + dolog("Long periodic timer"); + if (inl(0x834) & ~(0x4160)) + { + unsigned char s[40]; + strcpy(s, "Unknown: xxxxxxxx"); + tohex(s + 9, inl(0x834) & ~(0x140)); + dolog(s); + } + + outlog(); outl(0xCF8, pcisave); outb(0x3D4, vgasave); - outb(0x834, 0x40); // ack the periodic IRQ + outl(0x834, /*0x40*/0xFFFF); // ack the periodic IRQ outb(0x830, (inb(0x830) | 0x2) & ~0x40); outb(0x830, inb(0x830) | 0x40); diff --git a/grubload/Makefile b/grubload/Makefile index 572bc53..3cd15a7 100644 --- a/grubload/Makefile +++ b/grubload/Makefile @@ -1,4 +1,4 @@ -OBJS=multiboot_c.o multiboot_asm.o console.o minilib.o realmode.o loader.o ../pci/pci-smm.o +OBJS=multiboot_c.o multiboot_asm.o realmode.o loader.o ../pci/pci-smm.o ../lib/minilib.o ../lib/console.o CC=gcc CFLAGS=-nostdlib -I../include -I. -fno-builtin -nostdinc diff --git a/grubload/console-ext.h b/include/console-ext.h similarity index 100% rename from grubload/console-ext.h rename to include/console-ext.h diff --git a/grubload/console.h b/include/console.h similarity index 100% rename from grubload/console.h rename to include/console.h diff --git a/grubload/minilib.h b/include/minilib.h similarity index 100% rename from grubload/minilib.h rename to include/minilib.h diff --git a/grubload/video_defines.h b/include/video_defines.h similarity index 100% rename from grubload/video_defines.h rename to include/video_defines.h diff --git a/grubload/console.c b/lib/console.c similarity index 100% rename from grubload/console.c rename to lib/console.c diff --git a/grubload/minilib.c b/lib/minilib.c similarity index 79% rename from grubload/minilib.c rename to lib/minilib.c index b9813d7..f64f3b1 100644 --- a/grubload/minilib.c +++ b/lib/minilib.c @@ -46,18 +46,35 @@ int strlen(char *c) return l; } +void strcpy(unsigned char *a2, unsigned char *a1) +{ + do { + *(a2++) = *a1; + } while (*(a1++)); +} + void puts(char *c) { putbytes(c, strlen(c)); } static char hexarr[] = "0123456789ABCDEF"; -void puthex(unsigned long l) +void tohex(unsigned char *s, unsigned long l) { int i; for (i = 0; i < 8; i++) { - putbyte(hexarr[l >> 28]); + s[i] = hexarr[l >> 28]; l <<= 4; } } + +void puthex(unsigned long l) +{ + unsigned char d[9]; + d[8] = 0; + tohex(d, l); + puts(d); +} + + -- 2.39.2