[haiku-commits] r33535 - in haiku/trunk/src/system/boot/platform: . amiga_m68k

Author: mmu_man
Date: 2009-10-11 22:28:44 +0200 (Sun, 11 Oct 2009)
New Revision: 33535
Changeset: http://dev.haiku-os.org/changeset/33535/haiku

Added:
   haiku/trunk/src/system/boot/platform/amiga_m68k/
   haiku/trunk/src/system/boot/platform/amiga_m68k/Jamfile
   haiku/trunk/src/system/boot/platform/amiga_m68k/stage1.S
Log:
First attempt at an Amiga boot sector, not yet working.


Added: haiku/trunk/src/system/boot/platform/amiga_m68k/Jamfile
===================================================================
--- haiku/trunk/src/system/boot/platform/amiga_m68k/Jamfile                     
        (rev 0)
+++ haiku/trunk/src/system/boot/platform/amiga_m68k/Jamfile     2009-10-11 
20:28:44 UTC (rev 33535)
@@ -0,0 +1,131 @@
+SubDir HAIKU_TOP src system boot platform amiga_m68k ;
+
+SubDirHdrs $(HAIKU_TOP) headers private kernel boot platform 
$(TARGET_BOOT_PLATFORM) ;
+
+UsePrivateHeaders [ FDirName kernel boot platform $(TARGET_BOOT_PLATFORM) ] ;
+UsePrivateHeaders [ FDirName kernel platform $(TARGET_BOOT_PLATFORM) ] ;
+UsePrivateHeaders [ FDirName kernel disk_device_manager ] ;
+UsePrivateHeaders [ FDirName graphics common ] ;
+#UsePrivateHeaders [ FDirName graphics vesa ] ;
+UsePrivateHeaders [ FDirName storage ] ;
+
+{
+       local defines = _BOOT_MODE ;
+
+       defines = [ FDefines $(defines) ] ;
+       SubDirCcFlags $(defines) -Wall -Wno-multichar ;
+       SubDirC++Flags $(defines) -Wall -Wno-multichar -fno-rtti ;
+}
+
+#SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src add-ons accelerants common ] ;
+
+KernelMergeObject boot_platform_amiga_m68k_shell.o :
+       shell.S
+       : -Wa,--pcrel
+;
+
+# cpu-specific stuff
+# should be moved to boot/arch/m68k/...
+# XXX: add 020+68851 support
+KernelMergeObject boot_arch_m68k_030.o :
+       mmu_030.cpp
+       : -fno-pic -Wno-unused -m68030
+;
+
+KernelMergeObject boot_arch_m68k_040.o :
+       mmu_040.cpp
+       : -fno-pic -Wno-unused -m68040
+;
+
+KernelMergeObject boot_arch_m68k_060.o :
+       mmu_060.cpp
+       : -fno-pic -Wno-unused -m68060
+;
+
+
+KernelMergeObject boot_platform_amiga_m68k_other.o :
+#      shell.S
+       start.c
+       toscalls.c
+       debug.c
+       #bios.S
+       console.cpp
+       #serial.cpp
+       Handle.cpp
+       devices.cpp
+       keyboard.cpp
+       menu.cpp
+       mmu.cpp
+       cpu.cpp
+       #smp.cpp
+       #smp_trampoline.S
+#      support.S
+       video.cpp
+       #apm.cpp
+       
+       # generic
+       text_menu.cpp
+
+       # VESA/DDC EDID
+       #decode_edid.c
+       #dump_edid.c
+
+       : -fno-pic #-Wa,--pcrel
+;
+
+KernelMergeObject boot_platform_amiga_m68k.o :
+       : :
+       boot_platform_amiga_m68k_shell.o
+       boot_platform_amiga_m68k_other.o
+       boot_arch_m68k_030.o
+       boot_arch_m68k_040.o
+;
+
+# AUTO folder PRG target
+
+# based on KernelLd
+rule AtariBootPrgLd
+{
+       # AtariBootPrgLd <name> : <objs> : <linkerscript> : <args> ;
+
+       LINK on $(1) = $(TARGET_LD) ;
+
+       LINKFLAGS on $(1) = $(4) ;
+       if $(3) { LINKFLAGS on $(1) += --script=$(3) ; }
+
+       # Remove any preset LINKLIBS
+       LINKLIBS on $(1) = ;
+
+       # TODO: Do we really want to invoke SetupKernel here? The objects should
+       # have been compiled with KernelObjects anyway, so we're doing that 
twice.
+       SetupKernel $(2) ;
+
+       # Show that we depend on the libraries we need
+       LocalClean clean : $(1) ;
+       LocalDepends all : $(1) ;
+       Depends $(1) : $(2) ;
+
+       MakeLocateDebug $(1) ; 
+
+}
+
+actions AtariBootPrgLd
+{
+       $(LINK) $(LINKFLAGS) -o "$(1)" "$(2)" $(LINKLIBS) ;
+}
+
+AtariBootPrgLd haiku.prg :
+       boot_loader_$(TARGET_BOOT_PLATFORM)
+       : 
$(HAIKU_TOP)/src/system/ldscripts/$(TARGET_ARCH)/boot_prg_$(TARGET_BOOT_PLATFORM).ld
+       : -Bstatic
+;
+
+
+SEARCH on [ FGristFiles text_menu.cpp ]
+       = [ FDirName $(HAIKU_TOP) src system boot platform generic ] ;
+
+# Tell the build system to where stage1.bin can be found, so it can be used
+# elsewhere.
+SEARCH on stage1.bin = $(SUBDIR) ;
+
+# cf pxe_ia32 Jamfile for stage1

Added: haiku/trunk/src/system/boot/platform/amiga_m68k/stage1.S
===================================================================
--- haiku/trunk/src/system/boot/platform/amiga_m68k/stage1.S                    
        (rev 0)
+++ haiku/trunk/src/system/boot/platform/amiga_m68k/stage1.S    2009-10-11 
20:28:44 UTC (rev 33535)
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2009, François Revol, revol@xxxxxxxx
+ */
+
+#define FUNCTION(x) .global x; .type x,@function; x
+
+/*
+ * stage1 boot code for AmigaDOS for use as boot block of HDD partitions.
+ *
+ * cf.
+ * http://wandel.ca/homepage/execdis/virus_disassembly.txt
+ * http://ciarang.com/wiki/page/Minimal_Amiga_Boot_Code
+ *
+ * x86:
+ * The offset of the partition in 512 byte blocks must be written at
+ * position PARTITION_OFFSET_OFFSET (32 bit little endian; makebootable does
+ * that) or otherwise the code can't find the partition.
+ * The partition must be a BFS formatted. The file "system/haiku_loader"
+ * (the stage 2 boot loader) loaded into memory at 0x1000:0x0000 (linear 
address
+ * 0x10000) and entered at 0x:1000:0x0200 with parameters eax - partition 
offset
+ * in 512 byte blocks and dl - BIOS ID of the boot drive.
+ * 
+ * Compile via:
+ * 
+ * jam -q '<build>fixup_amiga_boot_checksum'
+ * generated.m68k/cross-tools/bin/m68k-unknown-haiku-gcc -nostdlib -fpic 
-Wa,--pcrel -c -o stage1.o src/system/boot/platform/amiga_m68k/stage1.S
+ * generated-m68k/cross-tools/bin/m68k-unknown-haiku-ld --oformat binary -o 
stage1.bin stage1.o
+ * 
generated-m68k/objects/linux/x86/release/tools/fixup_amiga_boot_checksum/fixup_amiga_boot_checksum
 stage1.bin
+ * generated.m68k/cross-tools/bin/m68k-unknown-haiku-ld -o stage1.prg stage1.o 
-T src/system/boot/platform/atari_m68k/prg.ld
+ * 
+ * Add to image:
+ * dd if=/dev/zero bs=512 count=$((80*2*11)) of=df0.adf
+ * dd if=stage1.bin bs=512 conv=notrunc of=df0.adf
+ * 
+ */
+
+
+// 1 enabled verbose output
+//#define DEBUG 1
+
+
+#define        BOOT_BLOCK_START_ADDRESS        0x7c00
+#define        STACK_ADDRESS                           BOOT_BLOCK_START_ADDRESS
+#define        READ_BUFFER_STACK                       STACK_ADDRESS - 0x2000
+#define        PARTITION_OFFSET_OFFSET         506
+#define        BFS_SUPERBLOCK_OFFSET           512
+
+
+// BFS definitions
+
+#define SUPER_BLOCK_MAGIC1                     '1SFB'          ; nasm reverses 
'...' consts
+#define SUPER_BLOCK_MAGIC2                     0xdd121031
+#define SUPER_BLOCK_MAGIC3                     0x15b6830e
+
+#define        INODE_MAGIC1                            0x3bbe0ad9
+
+#define        NUM_DIRECT_BLOCKS                       12
+
+#define        S_IFMT                                          00000170000o
+#define        S_IFDIR                                         00000040000o
+
+// AmigaDOS calls
+// dos.library
+#define _OldOpenLibrary                -0x198
+#define _CloseLibrary          -0x19e
+
+
+_floppy_entry:
+       .ascii  "DOS"
+       .byte   0
+_floppy_checksum:
+       .long   0
+_floppy_osversion: // ??
+       //.long 0x370
+       .long   0x09D5A859 // dos private ???
+
+_floppy_boot:
+       // seems like a6 is already set to ExecBase when called from the ROM ?
+       // copy it
+       lea     _execbase(%pc),%a2
+       move    %a6,(%a2)
+
+       lea     dosname_boot(%pc),%a1
+       jsr     _OldOpenLibrary(%a6)
+       lea     _dosbase(%pc),%a2
+       move    %d0,(%a2)
+
+       lea     dosname_boot(%pc),%a1
+       jsr     -0x60(%a6)      // FindResident()
+
+       tst.l   %d0
+       beq.s   _floppy_err
+
+       move.l  %d0,%a0
+       move.l  0x16(%a0),%a0
+       moveq   #0,%d0
+
+       rts
+
+_floppy_err:
+       moveq   #-1,%d0
+       rts
+
+dosname_boot:
+       .ascii  "dos.library"
+       .byte   0
+
+window_name:
+       .ascii  "CON:0/0/640/255/plop\0"
+
+_execbase:
+       .long   0
+_dosbase:
+       .long   0
+
+end_buff:
+// equ *-_floppy_entry
+       .dcb.b  (1024)-(end_buff-_floppy_entry),0
+
+#if 0
+//XXX: atari stuff here
+
+// NOTE: normal programs (.prg) run as user mode, 
+// while boot sector is chained in supervisor mode.
+// this means using Super(SUP_INQUIRE) we can know 
+// from the same entry point if we were run from boot code or prg.
+
+
+       //Pterm0
+       //move.w        #1,%d0
+       //trap  #1
+       //rts
+       
+       lea.l   str,%a0
+.loopt:
+       move.b  (%a0)+,%d0
+       beq     .strout
+       bsr     putc
+       bra     .loopt
+.strout:
+       //Pterm0
+       move.w  #1,%d0
+       trap    #1
+
+       rts
+       
+.loop:
+       move    #'.',%d0
+       bsr             putc
+       bra             .loop
+       rts
+
+/* prints the char in d0.b to the console */
+putc:
+       movem.l %a0,-(%sp)
+       move.w  %d0,-(%sp)
+       move.w  #DEV_CON,-(%sp) // DEV_CON
+       move.w  #3,-(%sp)       // Bconout
+       trap    #13
+       add.l   #6,%sp
+       movem.l (%sp)+,%a0
+       rts
+str:
+       .ascii "Haiku!"
+       .byte 0
+#endif


Other related posts: