diff options
author | Michael Brown <mcb30@etherboot.org> | 2005-05-17 16:44:57 +0000 |
---|---|---|
committer | Michael Brown <mcb30@etherboot.org> | 2005-05-17 16:44:57 +0000 |
commit | 1097cf8685cd81f0003bd6f17d050e5174a85b90 (patch) | |
tree | 47a39f2a1e980cca43c28c4d1a6dfdf431b910b2 /contrib/rom-scan | |
parent | 75a5374d79ee0defc46c306731142faccc6eda60 (diff) | |
download | ipxe-1097cf8685cd81f0003bd6f17d050e5174a85b90.tar.gz |
Initial revision
Diffstat (limited to 'contrib/rom-scan')
-rw-r--r-- | contrib/rom-scan/Makefile | 64 | ||||
-rw-r--r-- | contrib/rom-scan/rom-scan.c | 115 |
2 files changed, 179 insertions, 0 deletions
diff --git a/contrib/rom-scan/Makefile b/contrib/rom-scan/Makefile new file mode 100644 index 000000000..637404adc --- /dev/null +++ b/contrib/rom-scan/Makefile @@ -0,0 +1,64 @@ +CPPFLAGS = +LDLIBS = +CFLAGS = -pipe -g -O2 -Wall +LDFLAGS = -pipe +CC = gcc +LD = gcc +# Some "black" magic to determine optimal compiler flags for target +# architecture +TARGET_ARCH:= $(shell if [ \! -r .compile-options ] ; then ( \ + cpu=`grep cpu /proc/cpuinfo 2>&1 |head -1| \ + cut -d : -f 2-| sed -e 's/ //g'`; \ + if [ x"$$cpu" = x"" ] ; then \ + echo -fno-strength-reduce; \ + else if [ "$$cpu" = "386" ] ; then \ + echo -m386 -fno-strength-reduce; \ + else if [ "$$cpu" = "486" ] ; then \ + echo -m486 -fno-strength-reduce; \ + else if [ "$$cpu" = "Alpha" ] ; then \ + echo -fno-strength-reduce; \ + else echo main\(\)\{\} >.compile-options.c; \ + if gcc -mpentium -o .compile-options.o -c \ + .compile-options.c &>/dev/null; then \ + echo -mpentium -fstrength-reduce; \ + else if gcc -m486 -malign-functions=2 -malign-jumps=2 \ + -malign-loops=2 -o .compile-options.o -c \ + .compile-options.c &>/dev/null; then \ + echo -n -m486 -malign-functions=2 -malign-jumps=2; \ + echo ' '-malign-loops=2 -fno-strength-reduce; \ + else echo -m486; \ + fi;fi;fi;fi;fi;fi) > .compile-options; \ + rm -f .compile-options.c .compile-options.o; \ + fi; cat .compile-options) +ASFLAGS = $(TARGET_ARCH) + +OBJS = rom-scan.o + +############################################################################## + +ifeq (.depend,$(wildcard .depend)) +all: rom-scan +include .depend +else +all: depend + @$(MAKE) all +endif + +############################################################################## + +rom-scan: $(OBJS) + +############################################################################## + +clean: + $(RM) *~ *.o *.dvi *.log *.aux *yacc.tab.[ch] *yacc.output *lex.[co] \ + *.dat .depend .tmp_depend .compile-options* + strip rom-scan >&/dev/null || true + +############################################################################## + +depend: + for i in *.c;do $(CPP) $(CPPFLAGS) -MM $$i;done >.tmp_depend + mv .tmp_depend .depend + + diff --git a/contrib/rom-scan/rom-scan.c b/contrib/rom-scan/rom-scan.c new file mode 100644 index 000000000..c5e482991 --- /dev/null +++ b/contrib/rom-scan/rom-scan.c @@ -0,0 +1,115 @@ +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#ifndef __TURBOC__ +#include <sys/mman.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> +#endif + +#ifdef __TURBOC__ +#define HUGE huge +#else +#define HUGE +#endif + +#define ROMSTART 0xC8000 +#define ROMEND 0xE8000 +#define ROMINCREMENT 0x00800 +#define ROMMASK 0x03FFF + +#ifndef MAP_FAILED +#define MAP_FAILED ((void *)(long long)-1) +#endif + +typedef struct Images { + struct Images *next; + long start; + long size; +} Images; + +static void rom_scan(const unsigned char HUGE *rom,long offset,long len) +{ + static Images *images = NULL; + Images *ptr; +/* The assignments to dummy are to overcome a bug in TurboC */ + long dummy, size; + int chksum; + long i; + + if (rom[offset] != 0x55 || rom[dummy = offset+1] != 0xAA) + return; + size = (long)rom[dummy = offset+2]*512L; + printf("Found ROM header at %04lX:0000; " + "announces %ldk image (27C%02d EPROM)\n", + offset/16,(size+512)/1024, + size <= 1024 ? 8 : + size <= 2048 ? 16 : + size <= 4096 ? 32 : + size <= 8192 ? 64 : + size <= 16384 ? 128 : + size <= 32768 ? 256 : + size <= 65536 ? 512 : 11); + if (offset & ROMMASK) + printf(" This is a unusual position; not all BIOSs might find it.\n" + " Try to move to a 16kB boundary.\n"); + if (size > len) { + printf(" This image extends beyond %04X:0000. " + "It clashes with the system BIOS\n", + ROMEND/16); + size = len; } + for (chksum=0, i = size; i--; chksum += rom[dummy = offset+i]); + if (chksum % 256) + printf(" Checksum does not match. This image is not active\n"); + ptr = malloc(sizeof(Images)); + ptr->next = images; + ptr->start = offset; + ptr->size = size; + images = ptr; + for (ptr = ptr->next; ptr != NULL; ptr = ptr->next) { + for (i = 0; i < size && i < ptr->size; i++) + if (rom[dummy = ptr->start+i] != rom[dummy = offset+i]) + break; + if (i > 32) { + printf(" Image is identical with image at %04lX:0000 " + "for the first %ld bytes\n", + ptr->start/16,i); + if (i >= 1024) + if (i == size) + printf(" this means that you misconfigured the EPROM size!\n"); + else + printf(" this could suggest that you misconfigured the " + "EPROM size\n"); + else + printf(" this is probably harmless. Just ignore it...\n"); } } + return; +} + +int main(void) +{ + long i; + unsigned char HUGE *rom; + +#ifndef __TURBOC__ + int fh; + if ((fh = open("/dev/kmem",O_RDONLY|O_SYNC)) < 0) { + fprintf(stderr,"Could not open \"/dev/kmem\": %s\n",0 );//strerror(errno)); + return(1); } + if ((rom = mmap(NULL,ROMEND-ROMSTART,PROT_READ,MAP_SHARED,fh, + ROMSTART)) == MAP_FAILED) { + fprintf(stderr,"Could not mmap \"/dev/kmem\": %s\n",0); //strerror(errno)); + close(fh); + return(1); } + close(fh); +#endif + for (i = ROMEND; (i -= ROMINCREMENT) >= ROMSTART; ) +#ifdef __TURBOC__ + rom_scan(0,i,ROMEND-i); +#else + rom_scan(rom-ROMSTART,i,ROMEND-i); + munmap(rom,ROMEND-ROMSTART); +#endif + return(0); +} |