Fixes for mvme68k tape and disk bootloaders.
authorrahnds <rahnds@openbsd.org>
Fri, 16 Feb 1996 00:13:18 +0000 (00:13 +0000)
committerrahnds <rahnds@openbsd.org>
Fri, 16 Feb 1996 00:13:18 +0000 (00:13 +0000)
fix argument parsing for disk and tape boot
        bootsd/boot.c
        bugcrt/m68k/Makefile.inc

tape boot was broken completely
        bootst/bootst.c

minor bug if bootloader was specific size (aout exec header is 0x20 not 0x30).
        writvid/wrtvid.c

sys/arch/mvme68k/stand/bootsd/boot.c
sys/arch/mvme68k/stand/bootst/bootst.c
sys/arch/mvme68k/stand/bugcrt/m68k/Makefile.inc
sys/arch/mvme68k/stand/wrtvid/wrtvid.c

index b10b16b..e649328 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: boot.c,v 1.5 1995/12/06 10:54:55 deraadt Exp $ */
+/*     $Id: boot.c,v 1.6 1996/02/16 00:13:18 rahnds Exp $ */
 
 /*-
  * Copyright (c) 1995 Theo de Raadt
@@ -274,7 +274,7 @@ parse_args()
        int i, howto = 0;
        char c;
 
-       if (bugargs.arg_start == bugargs.arg_end) {
+       if (bugargs.arg_start != bugargs.arg_end) {
                ptr = bugargs.arg_start;
                while (c = *ptr) {
                        while (c == ' ')
@@ -291,8 +291,9 @@ parse_args()
                        }
                        while ((c = *++ptr) && c != ' ') {
                                for (i = 0; i < sizeof(bf)/sizeof(bf[0]); i++)
-                                       if (bf[i].c == c)
+                                       if (bf[i].c == c) {
                                                howto |= bf[i].bit;
+                                       }
                        }
                }
        }
index 4d85019..5b346ae 100644 (file)
@@ -25,12 +25,14 @@ struct kernel {
 
 typedef(*kernel_entry) __P((struct mvmeprom_args *, struct kernel *));
 
+extern struct mvmeprom_args bugargs;
 int
-main(pbugargs)
-       struct mvmeprom_args *pbugargs;
+main()
 {
        kernel_entry addr;
+       struct mvmeprom_args *pbugargs;
 
+       pbugargs = &bugargs;
        /*
        print_bugargs(pbugargs);
        print_time();
@@ -43,6 +45,7 @@ main(pbugargs)
        } else {
                addr = kernel.entry;
 
+#if 0
                printf("kernel loaded at %x\n", addr);
                printf("kernel.entry %x\n", kernel.entry);
                printf("kernel.symtab %x\n", kernel.symtab);
@@ -54,16 +57,29 @@ main(pbugargs)
                else
                        printf("kernel.kname <null>\n");
                printf("kernel.end_loaded %x\n", kernel.end_loaded);
+#endif
 
                if (kernel.bflags & RB_MINIROOT)
                        loadmini(kernel.end_loaded, pbugargs);
 
+#if 0
                printf("kernel.smini %x\n", kernel.smini);
                printf("kernel.emini %x\n", kernel.emini);
                printf("kernel.end_loaded %x\n", kernel.end_loaded);
+#endif
                if (kernel.bflags & RB_HALT)
                        mvmeprom_return();
-               (addr) (pbugargs, &kernel);
+               if (((u_long)addr &0xf) == 0x2) {
+                       (addr)(pbugargs, &kernel);
+               } else {
+                       /* is type fixing anything like price fixing? */
+                       typedef (* kernel_start) __P((int, int, void *,void *, void *));
+                       kernel_start addr1;
+                       addr1 = (void *)addr;
+                       (addr1)(kernel.bflags, 0, kernel.esym, kernel.smini, kernel.emini
+       );
+               }
+
        }
        return (0);
 }
@@ -136,7 +152,7 @@ load_kern(pbugargs)
        ret = read_tape_block(pbugargs->ctrl_lun, pbugargs->dev_lun, &status,
            buf, &cnt, blk_num, &flags, verbose);
        if (ret != 0) {
-               printf("unable to load kernel 1\n");
+               printf("unable to load kernel 1 status %x\n", status);
                return (1);
        }
        pexec = (struct exec *) buf;
@@ -163,7 +179,6 @@ load_kern(pbugargs)
                addr = (char *) (pexec->a_entry & ~0x0FFF);
 
                if ((int) pexec->a_entry != (int) addr + 0x22) {
-                       printf("warning kernel start address not %x, %x\n",
                            (int) addr + 0x22, pexec->a_entry);
                        printf("kernel loaded at %x\n", addr);
                }
@@ -184,7 +199,7 @@ load_kern(pbugargs)
                ret = read_tape_block(pbugargs->ctrl_lun, pbugargs->dev_lun,
                    &status, addr, &cnt, blk_num, &flags, verbose);
                if (ret != 0 || cnt != len) {
-                       printf("unable to load kernel 2\n");
+                       printf("unable to load kernel 2 status %x\n", status);
                        return 1;
                }
                addr += len;
index 6d78b7d..b2a21ad 100644 (file)
@@ -51,7 +51,7 @@ main(argc, argv)
        }else {
                pcpul->vid_oss = 2;
        }
-       pcpul->vid_osl = (((stat.st_size -0x30) +511) / 512) *2;
+       pcpul->vid_osl = (((stat.st_size -0x20) +511) / 512) *2;
 
        lseek(exe_file, 0x14, SEEK_SET);
        read(exe_file, &exe_addr, 4);