[haiku-commits] r38908 - haiku/trunk/src/system/boot/platform/amiga_m68k

  • From: revol@xxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 9 Oct 2010 22:57:39 +0200 (CEST)

Author: mmu_man
Date: 2010-10-09 22:57:39 +0200 (Sat, 09 Oct 2010)
New Revision: 38908
Changeset: http://dev.haiku-os.org/changeset/38908

Added:
   haiku/trunk/src/system/boot/platform/amiga_m68k/shell.S
Log:
Clone the atari shell code.


Copied: haiku/trunk/src/system/boot/platform/amiga_m68k/shell.S (from rev 
38906, haiku/trunk/src/system/boot/platform/atari_m68k/shell.S)
===================================================================
--- haiku/trunk/src/system/boot/platform/amiga_m68k/shell.S                     
        (rev 0)
+++ haiku/trunk/src/system/boot/platform/amiga_m68k/shell.S     2010-10-09 
20:57:39 UTC (rev 38908)
@@ -0,0 +1,500 @@
+/*
+ * Copyright 2004-2005, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx All rights 
reserved.
+ * Copyright 2005, Ingo Weinhold, bonefish@xxxxxxxxxxxxx
+ * Copyright 2007, Haiku, Inc. All Rights Reserved.
+ * Distributed under the terms of the MIT license.
+ *
+ * Author:
+ *             François Revol, revol@xxxxxxxx
+ */
+
+/**    This file contains the boot floppy and BFS boot block entry points for
+ *     the stage 2 boot loader.
+ * x86 ahead:
+ *     The floppy entry point is at offset 0. It's loaded at 0x07c0:0x000. It
+ *     will load the rest of the loader to 0x1000:0x0200 and execute it.
+ *     The BFS boot block will load the whole stage 2 loader to 0x1000:0x0000
+ *     and will then jump to 0x1000:0x0200 as its entry point.
+ *     This code will then switch to protected mode and will directly call
+ *     the entry function of the embedded ELF part of the loader.
+ */
+
+/*
+ * generate boot floppy:
+ * cd src/system/boot/platform/atari_m68k/ ; make fixup_tos_floppy_chksum; cd -
+ * dd if=generated/objects/haiku/m68k/release/system/boot/haiku_loader 
of=~/floppy.img bs=512 count=20 conv=notrunc
+ * src/system/boot/platform/atari_m68k/fixup_tos_floppy_chksum ~/floppy.img
+ * generate .prg:
+ * generated.m68k/cross-tools/bin/m68k-unknown-haiku-ld -o haiku.prg -T 
src/system/ldscripts/m68k/boot_prg_atari_m68k.ld 
generated/objects/haiku/m68k/release/system/boot/boot_loader_atari_m68k
+ */
+
+/*
+ * references :
+ * 
http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-3-0/src/sys/arch/atari/stand/xxboot/fdboot/fdboot.S
+ */
+
+#include "atari_memory_map.h"
+#include "toscalls.h"
+
+// 1 enabled verbose output
+//#define DEBUG 1
+
+#define GLOBAL(x) .globl x ; x
+#define FUNCTION(x) .global x; .type x,@function; x
+
+#define DRIVE_RETRIES 3
+       // when the drive reading fails for some reason, it will
+       // retry this many times until it will report a failure
+
+
+#define SECTSIZE 512
+
+//.text
+_bs_entry:
+/* main entry point, both from the floppy boot and .prg */
+       bra.s   real_entry
+
+//FAT lookalike to avoid nasty things from happening
+// http://alive.atari.org/alive10/btmania.php
+// MS-DOS values :
+// http://support.microsoft.com/kb/75131/en
+// http://alumnus.caltech.edu/~pje/dosfiles.html
+       .ascii  "Haiku "
+       .byte   0xbe, 0x50, 0x38 // id
+       //LITTLE ENDIAN!
+       .byte   0x00, 0x02      //BPS
+       .byte   0x02            //SPC
+       //.byte 0x00            //???
+       .byte   0x00, 0x02      //RES - number of reserved sectors
+       .byte   0x00            //NFATS
+       .byte   0x00, 0x00      //NDIRS
+       .byte   0x40, 0x0b      //NSECTS
+       .byte   0xf0            //MEDIA
+       .byte   0x05, 0x00      //SPF
+_fat_spt:      
+       .byte   0x12, 0x00      //SPT
+       .byte   0x02, 0x00      //NSIDES
+       .byte   0x00, 0x00      //NHID
+       // we're done
+
+sNumSectors:
+       // this location will contain the length of the boot loader as
+       // written by the "makeflop" command in 512 byte blocks
+       // 0x180 is the allowed maximum, as the zipped TAR with the
+       // kernel and the boot module might start at offset 192 kB
+       //.word 0x0300 //0x0180
+       .word   BOOT_ARCHIVE_IMAGE_OFFSET*2
+
+real_entry:
+
+// save the regs to return safely, like the NetBSD loader does:
+// 
http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-3-0/src/sys/arch/atari/stand/xxboot/fdboot/fdboot.S
+       movem.l         %d1-%d7/%a0-%a6,-(%sp)
+
+       lea             str,%a0
+       bsr             puts
+
+       // first, determine if .prg (user) or bootsect (super)
+       // Super()
+       move.l          #SUP_INQUIRE,-(%sp)
+       move.w          #0x20,-(%sp)
+       trap            #GEMDOS_TRAP
+       addq.l          #6,%sp
+
+       cmp.l           #SUP_USER,%d0
+       bne                     floppy_start
+       bra                     prg_start
+
+/*
+ * floppy boot support code
+ */
+
+floppy_start:
+       lea             label_floppy,%a0
+       bsr             puts
+       //bra floppy_start
+
+       // no interrupt
+       //or.w          #0x0700,%sr
+
+       //XXX: check for enough RAM
+
+       // load the rest
+       //move.w                sNumSectors,%d2
+       // load at base + this code.
+       //move.l                #(ATARI_ZBEOS_BASE+512),%a2
+       //move.l                %a2,%d0
+       //bsr putx
+       bsr                     load_sectors
+       tst.w                   %d0
+       bne                     load_failed
+floppy_done:
+       // setup stack
+       move.l          #ATARI_ZBEOS_STACK_END,%sp
+       //jmp                   ATARI_ZBEOS_BASE+512
+
+       move.b          #ATARI_BOOT_DRVAPI_FLOPPY,ATARI_ZBEOS_BASE + 
gBootDriveAPI - _bs_entry 
+       move.w          TOSVAR_bootdev,%d0
+       // XXX:  use uint16 ??
+       move.b          %d0,ATARI_ZBEOS_BASE + gBootDriveID - _bs_entry 
+       move.b          #1,ATARI_ZBEOS_BASE + gBootedFromImage - _bs_entry 
+
+       lea             msg_j1,%a0
+       bsr             puts
+       move.l          #0,%d0
+
+       jmp             _start
+
+load_failed:
+       //bra                   _exit
+
+spin:  
+       //bra                   spin
+_exit: /*  */
+       lea                     failure_string,%a0
+       bsr                     puts
+       bsr                     getc
+       
+       movem.l (%sp)+,%d1-%d7/%a0-%a6
+       rts
+       //rts
+
+/**    Loads %d2 sectors from floppy disk, starting at head XXX %dh, sector 
%cx.
+ *     The data is loaded to %a2.
+ */
+
+load_sectors:
+       
+#if 0
+       /* it seems to skip 9 every 9 sectors, buggy side handling ? */
+       // Rwabs
+       //move.l                #1,-(%sp)
+       move.w          #0,-(%sp)       // A:
+       //move.w                #2,-(%sp)       // C:
+       //move.w                #-1,-(%sp)      // 2nd sector
+       move.w          #1,-(%sp)       // 2nd sector
+       move.w          %d2,-(%sp)
+       move.l          %a2,-(%sp)
+       //move.w                #RW_READ+RW_NOTRANSLATE,-(%sp)
+       move.w          #RW_READ+RW_NOMEDIACH,-(%sp)
+       move.w          #4,-(%sp)
+       trap            #13
+       add.l           #14,%sp
+#endif
+#if 0
+       // d2:  
+
+       //move.w                %d2,-(%sp)
+       move.w          #1,-(%sp) // count
+       move.w          #0,-(%sp) // sideno
+       move.w          #0,-(%sp) // trackno
+       move.w          #1,-(%sp) // sectno
+       move.w          TOSVAR_bootdev,-(%sp) // devno
+       clr.l           -(%sp) // filler
+       //move.w                #0,-(%sp)
+       //move.l                %a2,-(%sp)
+       move.l          #ATARI_ZBEOS_BASE,-(%sp)
+       move.w          #8,-(%sp)       // floprd
+       trap            #XBIOS_TRAP
+       add.l           #20,%sp
+#endif
+
+       //bsr   putx
+       //rts
+
+       /*
+        * %d3: remaining sects
+        * %d4: sectno
+        * %d5: trackno
+        * %d6: sideno
+        * %d7: sect / track
+        * %a5: buffer
+        *
+        */
+       // load the rest
+
+       // XXX:  the NetBSD loader probes it, but trying to asserts ARAnyM
+       clr.l           %d7
+       move.b          _fat_spt,%d7    // sect/track
+       //move.w                #0,%d7  // sect/track
+       move.w          #0,%d6  // sideno
+       move.w          #0,%d5  // trackno
+       move.w          #1,%d4  // sectno
+       move.w          sNumSectors,%d3 // remainder
+       move.l          #ATARI_ZBEOS_BASE,%a5
+read_sectors_loop:     
+       bsr.s           read_sect
+       bne             read_sectors_fail
+       moveq           #'.',%d0
+       bsr             putc
+       subq.w          #1,%d3  // remainder--
+       bne.s           read_sectors_next
+       bsr     putcrlf
+       clr.l           %d0
+       rts
+
+       // compute next track/side/sector
+read_sectors_next:
+#if 0  //DEBUG
+       // [TRAK][SIDE]
+       move.w          %d5,%d0
+       swap            %d0
+       move.w          %d6,%d0
+       bsr             putx
+       // [SECT][S/TK]
+       move.w          %d4,%d0
+       swap            %d0
+       move.w          %d7,%d0
+       bsr             putx
+       //bsr           getc
+#endif //!DEBUG
+       add.l           #SECTSIZE,%a5
+       addq.w          #1,%d4  // sectno++
+       cmp.w           %d7,%d4 // if (sectno == spt)
+       bne.s           .rs2    // {
+       addq.w          #1,%d6  //      sideno++ ;
+       cmp.w           #2,%d6  //      if (sideno == 2) {
+       bne             .rs1
+       clr.w           %d6     //              sideno = 0 ;
+       addq.w          #1,%d5  //              trackno++ ;
+       bsr     putcrlf
+
+.rs1:                          //      }
+       clr.w           %d4     //      sectno = 0 ;
+.rs2:                          // }
+       
+       bra.s           read_sectors_loop
+
+read_sectors_fail:
+       tst.w           %d7     // s/t
+       bne             read_sectors_fail2
+       move.w          %d4,%d0
+       bsr             putx
+       move.w          %d4,%d7
+       clr.w           %d4
+       //add.w         #1,
+       bra.s           read_sectors_next
+read_sectors_fail2:
+       moveq           #1,%d0
+       rts
+
+       
+read_sect:     /* read 1 sector */
+       /*
+        * %d4: sectno
+        * %d5: trackno
+        * %d6: sideno
+        * %d7: remaining count
+        * %a5: buffer
+        *
+        */
+#if 1
+       //move.w                %d2,-(%sp)
+       //move.w                #1,-(%sp) // count
+       //move.w                #0,-(%sp) // sideno
+       //move.w                #0,-(%sp) // trackno
+       //move.w                #2,-(%sp) // sectno
+       move.w          #1,-(%sp)
+       movem.w         %d4-%d6,-(%sp)
+       move.w          TOSVAR_bootdev,-(%sp) // devno
+       clr.l           -(%sp) // filler
+       move.l          %a5,-(%sp)
+       move.w          #8,-(%sp)       // floprd
+       trap            #XBIOS_TRAP
+       add.l           #20,%sp
+       tst.l           %d0
+       
+#endif
+       rts
+
+floppy_end:
+//     .org    FAILURE_STRING
+failure_string:
+//     .string " Loading failed! Press key to reboot.\r\n"
+       .string " Loading failed! Press key.\r\n"
+//     .string "FAIL"
+       
+//     .org    DOT_STRING
+//     .string "."
+
+
+
+
+putx:
+       movem.l %d0-%d2/%a0-%a2,-(%sp)
+       move.l  #8-1,%d2
+       move.l  %d0,%d1
+putxloop:
+       move.l  %d1,%d0
+       lsl.l   #4,%d1
+       //swap  %d0
+       //lsr.l #8,%d0
+       //lsr.l #4,%d0
+       rol.l   #4,%d0
+       and.l   #0x0f,%d0
+       cmp.b   #9,%d0
+       ble     putx0
+       add.b   #'a'-'0'-10,%d0
+       //bra   putxdisp
+putx0:
+       add.b   #'0',%d0
+putxdisp:
+       bsr     putc
+       dbf     %d2,putxloop
+       bsr     putcrlf
+       movem.l (%sp)+,%d0-%d2/%a0-%a2
+       rts
+       
+
+puts:
+.loopt:
+       move.b  (%a0)+,%d0
+       beq     .strout
+       bsr     putc
+       bra     .loopt
+.strout:
+putcrlf:       
+       move.b  #'\r',%d0
+       bsr     putc
+       move.b  #'\n',%d0
+       bsr     putc
+       rts
+       
+
+/* prints the char in d0.b to the console */
+putc:
+       movem.l %d0-%d2/%a0-%a2,-(%sp)
+       move.w  %d0,-(%sp)
+       move.w  #DEV_CON,-(%sp) // DEV_CON
+       move.w  #3,-(%sp)       // Bconout
+       trap    #BIOS_TRAP
+       add.l   #6,%sp
+       movem.l (%sp)+,%d0-%d2/%a0-%a2
+       rts
+
+/* waits for a key */
+getc:
+       movem.l %d1-%d2/%a0-%a2,-(%sp)
+       move.w  #DEV_CON,-(%sp) // DEV_CON
+       move.w  #2,-(%sp)       // Bconin
+       trap    #BIOS_TRAP
+       add.l   #4,%sp
+       movem.l (%sp)+,%d1-%d2/%a0-%a2
+       rts
+
+str:
+       .string "Haiku!"
+label_prg:
+       .string "P" //"RG boot"
+label_floppy:
+       .string "F" //"loppy boot"
+h4:
+       .string "H4"
+h5:
+       .string "H5"
+msg_j1:
+       .string "Jumping to haiku_loader."
+
+shell_end:
+       //.fill (0x01fe - shell_end), 1, 0x55
+       .org    0x01fe
+       .word   0xaa55-1        // will be replaced by the one calculated by 
the build.
+               // we make sure PCs don't try to execute it.
+               // this bumps the "start" label to offset 0x0200 as
+               // expected by the BFS boot loader, and also marks
+               // this block as valid boot block for the BIOS
+
+//XXX: put bfs_start here
+
+/*
+ * \AUTO\HAIKU.PRG and ARAnyM BOOTSTRAP() support code
+ */
+
+prg_start:
+       lea             label_prg,%a0
+       bsr             puts
+
+       // .prg:
+       // we need to switch to supervisor mode anyway
+       move.l          #SUP_SET,-(%sp)
+       move.w          #0x20,-(%sp)
+       trap            #1
+       addq.l          #6,%sp
+       move.l          %d0,saved_super_stack
+       
+#if 0
+                       //_membot
+       move.l          #0x432,%a0
+       move.l          (%a0),%d0
+       bsr             putx
+
+                       //_memtop
+       move.l          #0x436,%a0
+       move.l          (%a0),%d0
+       bsr             putx
+
+                       //_v_bas_ad
+       move.l          #0x44e,%a0
+       move.l          (%a0),%d0
+       bsr             putx
+#endif
+       // disable interrupts
+       //or.w          #0x0700,%sr
+       
+       // setup stack
+       move.l          #ATARI_ZBEOS_STACK_END,%sp
+
+       lea             h5,%a0
+       bsr             puts
+       lea             _bs_entry,%a0
+       move.l          %a0,%d0
+       bsr             putx
+
+       // copy the rest of the prg
+
+       // load counter
+       clr.l           %d0
+       move.w          sNumSectors,%d0
+       sub.w           #1,%d0
+       // load addresses
+       lea             _bs_entry,%a0
+       move.l          #ATARI_ZBEOS_BASE,%a1
+
+
+nextsect:
+       move.l          #512/4-1,%d1
+copysect_loop:
+       move.l          (%a0)+,(%a1)+
+       dbf             %d1,copysect_loop
+       //bsr           putx
+       dbf             %d0,nextsect
+
+       lea             msg_j1,%a0
+       bsr             puts
+       // all done
+super_done:
+       // XXX: copy the rest !
+       move.b          #ATARI_BOOT_DRVAPI_FLOPPY,ATARI_ZBEOS_BASE + 
gBootDriveAPI - _bs_entry 
+       move.b          #0,ATARI_ZBEOS_BASE + gBootDriveID - _bs_entry 
+       move.b          #1,ATARI_ZBEOS_BASE + gBootedFromImage - _bs_entry 
+
+       move.l          #0,%d0
+
+       //jmp                   ATARI_ZBEOS_BASE+512
+       jmp                     _start
+
+saved_super_stack:
+       .long   0
+
+GLOBAL(gBootedFromImage):
+       .byte   0
+
+GLOBAL(gBootDriveAPI):
+       .byte   ATARI_BOOT_DRVAPI_UNKNOWN
+
+GLOBAL(gBootDriveID):
+       .byte   0
+
+GLOBAL(gBootPartitionOffset):
+       .long   0
+


Other related posts:

  • » [haiku-commits] r38908 - haiku/trunk/src/system/boot/platform/amiga_m68k - revol