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