11 #if defined(__alpha__) || defined (__ia64__)
13 #elif defined(HAVE_SYS_PERM)
19 #include "AsmMacros.h"
22 #define VRAM_START 0xA0000
23 #define VRAM_SIZE 0x1FFFF
24 #define V_BIOS_SIZE 0x1FFFF
25 #define BIOS_START 0x7C00 /* default BIOS entry */
26 #define BIOS_MEM 0x600
28 CARD8 code[] = { 0xcd, 0x10, 0xf4 };
32 static void unmap(void);
33 static void runBIOS(int argc, char **argv);
34 static int map_vram(void);
35 static void unmap_vram(void);
36 static int copy_vbios(memType base);
37 static int copy_sys_bios(void);
38 static CARD32 setup_int_vect(void);
39 static void update_bios_vars(void);
40 static int chksum(CARD8 *start);
41 static void setup_bios_regs(i86biosRegsPtr regs, int argc, char **argv);
42 static void print_regs(i86biosRegsPtr regs);
43 void dprint(unsigned long start, unsigned long size);
45 void loadCodeToMem(unsigned char *ptr, CARD8 *code);
47 static int vram_mapped = 0;
48 static char* bios_var;
52 main(int argc,char **argv)
56 Config.PrintPort = PRINT_PORT;
57 Config.IoStatistics = IO_STATISTICS;
58 Config.PrintIrq = PRINT_IRQ;
59 Config.PrintPci = PRINT_PCI;
60 Config.ShowAllDev = SHOW_ALL_DEV;
61 Config.PrintIp = PRINT_IP;
62 Config.SaveBios = SAVE_BIOS;
64 Config.ConfigActiveOnly = CONFIG_ACTIVE_ONLY;
65 Config.ConfigActiveDevice = CONFIG_ACTIVE_DEVICE;
66 Config.MapSysBios = MAP_SYS_BIOS;
67 Config.Resort = RESORT;
68 Config.FixRom = FIX_ROM;
69 Config.NoConsole = NO_CONSOLE;
70 Config.Verbose = VERBOSE;
76 if (!(vbios_base = setup_int_vect()))
80 if (!copy_vbios(vbios_base))
99 mem = mmap(0, (size_t)SIZE,
100 PROT_EXEC | PROT_READ | PROT_WRITE,
101 MAP_FIXED | MAP_PRIVATE | MAP_ANON,
104 perror("anonymous map");
109 loadCodeToMem((unsigned char *) BIOS_START, code);
116 #define SYS_BIOS 0xF0000
119 if ((mem_fd = open(MEM_FILE,O_RDONLY))<0) {
120 perror("opening memory");
124 if (lseek(mem_fd,(off_t) SYS_BIOS,SEEK_SET) != (off_t) SYS_BIOS)
126 if (read(mem_fd, (char *)SYS_BIOS, (size_t) 0xFFFF) != (size_t) 0xFFFF)
144 if ((mem_fd = open(MEM_FILE,O_RDWR | O_SYNC))<0)
146 if ((mem_fd = open(MEM_FILE,O_RDWR))<0)
149 perror("opening memory");
154 if (mmap((void *) VRAM_START, (size_t) VRAM_SIZE,
155 PROT_EXEC | PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED,
156 mem_fd, VRAM_START) == (void *) -1)
158 if (!_bus_base()) sparse_shift = 7; /* Uh, oh, JENSEN... */
159 if (!_bus_base_sparse()) sparse_shift = 0;
160 if ((vram_map = mmap(0,(size_t) (VRAM_SIZE << sparse_shift),
161 PROT_READ | PROT_WRITE,
163 mem_fd, (VRAM_START << sparse_shift)
164 | _bus_base_sparse())) == (void *) -1)
167 perror("mmap error in map_hardware_ram");
177 copy_vbios(memType v_base)
183 if ((mem_fd = open(MEM_FILE,O_RDONLY))<0) {
184 perror("opening memory");
188 if (lseek(mem_fd,(off_t) v_base, SEEK_SET) != (off_t) v_base) {
189 fprintf(stderr,"Cannot lseek\n");
192 tmp = (unsigned char *)malloc(3);
193 if (read(mem_fd, (char *)tmp, (size_t) 3) != (size_t) 3) {
194 fprintf(stderr,"Cannot read\n");
197 if (lseek(mem_fd,(off_t) v_base,SEEK_SET) != (off_t) v_base)
200 if (*tmp != 0x55 || *(tmp+1) != 0xAA ) {
201 fprintf(stderr,"No bios found at: 0x%lx\n",v_base);
205 dprint((unsigned long)tmp,0x100);
207 size = *(tmp+2) * 512;
209 if (read(mem_fd, (char *)v_base, (size_t) size) != (size_t) size) {
210 fprintf(stderr,"Cannot read\n");
215 if (!chksum((CARD8*)v_base))
235 if (!vram_mapped) return;
237 munmap((void*)VRAM_START,VRAM_SIZE);
242 runBIOS(int argc, char ** argv)
246 printf("starting BIOS\n");
248 setup_bios_regs(&bRegs, argc, argv);
249 do_x86(BIOS_START,&bRegs);
263 if ((mem_fd = open(MEM_FILE,O_RDONLY))<0) {
264 perror("opening memory");
268 if ((map = mmap((void *) 0, (size_t) 0x2000,
269 PROT_EXEC | PROT_READ | PROT_WRITE, MAP_SHARED,
270 mem_fd, 0)) == (void *)-1) {
271 perror("mmap error in map_hardware_ram");
277 memcpy(0,map,BIOS_MEM);
280 * create a backup copy of the bios variables to write back the
283 bios_var = (char *)malloc(BIOS_MEM);
284 memcpy(bios_var,0,BIOS_MEM);
286 vbase = (*((CARD16*)(0x10 << 2) + 1)) << 4;
287 fprintf(stderr,"vbase: 0x%x\n",vbase);
292 update_bios_vars(void)
299 if ((mem_fd = open(MEM_FILE,O_RDWR | O_SYNC))<0)
301 if ((mem_fd = open(MEM_FILE,O_RDWR))<0)
304 perror("opening memory");
308 if ((map = mmap((void *) 0, (size_t) 0x2000,
309 PROT_EXEC | PROT_READ | PROT_WRITE, MAP_SHARED,
310 mem_fd, 0)) == (void *)-1) {
311 perror("mmap error in map_hardware_ram");
316 for (i = 0; i < BIOS_MEM; i++) {
317 if (bios_var[i] != *(CARD8*)i)
318 *((CARD8*)map + i) = *(CARD8*)i;
327 setup_bios_regs(i86biosRegsPtr regs, int argc, char **argv)
338 while ((c = getopt(argc,argv,"a:b:c:d:e:i:")) != EOF) {
341 regs->ax = strtol(optarg,NULL,0);
344 regs->bx = strtol(optarg,NULL,0);
347 regs->cx = strtol(optarg,NULL,0);
350 regs->dx = strtol(optarg,NULL,0);
353 regs->es = strtol(optarg,NULL,0);
356 regs->di = strtol(optarg,NULL,0);
370 size = *(start+2) * 512;
371 for (i = 0; i<size; i++)
377 fprintf(stderr,"BIOS cksum wrong!\n");
382 print_regs(i86biosRegsPtr regs)
384 printf("ax=%x bx=%x cx=%x dx=%x es=%x di=%x\n",(CARD16)regs->ax,
385 (CARD16)regs->bx,(CARD16)regs->cx,(CARD16)regs->dx,
386 (CARD16)regs->es,(CARD16)regs->di);
390 loadCodeToMem(unsigned char *ptr, CARD8 code[])
398 if (val == 0xf4) break;
404 dprint(unsigned long start, unsigned long size)
407 char *c = (char *)start;
409 for (j = 0; j < (size >> 4); j++) {
410 printf ("\n0x%lx: ",(unsigned long)c);
411 for (i = 0; i<16; i++)
412 printf("%x ",(unsigned char) (*(c++)));