diff --git a/Utilities/BootInstall/bootsrc/Makefile b/Utilities/BootInstall/bootsrc/Makefile deleted file mode 100644 index 0cc5dcc8..00000000 --- a/Utilities/BootInstall/bootsrc/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -DESTDIR ?= .. -BOOTSECTORS = boot0 boot1f32 - -BOOTSECTOR_SRCS = $(addsuffix .nasm, $(BOOTSECTORS)) -BOOTSECTOR_BINS = $(addprefix $(DESTDIR)/, $(BOOTSECTORS)) - -ifdef NASM_PREFIX -NASM=$(NASM_PREFIX)nasm -else -NASM=nasm -endif - -all: $(BOOTSECTOR_BINS) - -$(BOOTSECTOR_BINS): $(BOOTSECTOR_SRCS) - @echo "[NASM] $(@F).nasm -> $@" - @"$(NASM)" $(@F).nasm -o $@ - -clean: - rm -f $(BOOTSECTOR_BINS) *~ diff --git a/Utilities/BootInstall/bootsrc/boot0.nasm b/Utilities/BootInstall/bootsrc/boot0.nasm deleted file mode 100644 index b00a94ee..00000000 --- a/Utilities/BootInstall/bootsrc/boot0.nasm +++ /dev/null @@ -1,739 +0,0 @@ -; Copyright (c) 1999-2003 Apple Computer, Inc. All rights reserved. -; -; @APPLE_LICENSE_HEADER_START@ -; -; Portions Copyright (c) 1999-2003 Apple Computer, Inc. All Rights -; Reserved. This file contains Original Code and/or Modifications of -; Original Code as defined in and that are subject to the Apple Public -; Source License Version 2.0 (the "License"). You may not use this file -; except in compliance with the License. Please obtain a copy of the -; License at http://www.apple.com/publicsource and read it before using -; this file. -; -; The Original Code and all software distributed under the License are -; distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER -; EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, -; INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, -; FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the -; License for the specific language governing rights and limitations -; under the License. -; -; @APPLE_LICENSE_HEADER_END@ -; -; Boot Loader: boot0 -; -; A small boot sector program written in x86 assembly whose only -; responsibility is to locate the active partition, load the -; partition booter into memory, and jump to the booter's entry point. -; It leaves the boot drive in DL and a pointer to the partition entry in SI. -; This version of boot0 implements hybrid GUID/MBR partition scheme support. -; -; This boot loader must be placed in the Master Boot Record. -; -; In order to coexist with a fdisk partition table (64 bytes), and -; leave room for a two byte signature (0xAA55) in the end, boot0 is -; restricted to 446 bytes (512 - 64 - 2). If boot0 did not have to -; live in the MBR, then we would have 510 bytes to work with. -; -; boot0 is always loaded by the BIOS or another booter to 0:7C00h. -; -; This code is written for the NASM assembler. -; nasm boot0.s -o boot0 -; -; Written by Tamás Kosárszky on 2008-03-10 and JrCs on 2013-05-08. -; With additions by Turbo for EFI System Partition boot support. -; - -; -; Set to 1 to enable obscure debug messages. -; -DEBUG EQU 0 - -; -; Set to 1 to enable verbose mode -; -VERBOSE EQU 0 - -; -; Various constants. -; -kBoot0Segment EQU 0x0000 -kBoot0Stack EQU 0xFFF0 ; boot0 stack pointer -kBoot0LoadAddr EQU 0x7C00 ; boot0 load address -kBoot0RelocAddr EQU 0xE000 ; boot0 relocated address - -kMBRBuffer EQU 0x1000 ; MBR buffer address -kLBA1Buffer EQU 0x1200 ; LBA1 - GPT Partition Table Header buffer address -kGPTABuffer EQU 0x1400 ; GUID Partition Entry Array buffer address - -kPartTableOffset EQU 0x1be -kMBRPartTable EQU kMBRBuffer + kPartTableOffset - -kSectorBytes EQU 512 ; sector size in bytes -kBootSignature EQU 0xAA55 ; boot sector signature -kFAT32BootCodeOffset EQU 0x5a ; offset of boot code in FAT32 boot sector -kBoot1FAT32Magic EQU 'BO' ; Magic string to detect our boot1f32 code - - -kGPTSignatureLow EQU 'EFI ' ; GUID Partition Table Header Signature -kGPTSignatureHigh EQU 'PART' -kGUIDLastDwordOffs EQU 12 ; last 4 byte offset of a GUID - -kPartCount EQU 4 ; number of paritions per table -kPartTypeFAT32 EQU 0x0c ; FAT32 Filesystem type -kPartTypePMBR EQU 0xee ; On all GUID Partition Table disks a Protective MBR (PMBR) - ; in LBA 0 (that is, the first block) precedes the - ; GUID Partition Table Header to maintain compatibility - ; with existing tools that do not understand GPT partition structures. - ; The Protective MBR has the same format as a legacy MBR - ; and contains one partition entry with an OSType set to 0xEE - ; reserving the entire space used on the disk by the GPT partitions, - ; including all headers. - -kPartActive EQU 0x80 ; active flag enabled -kPartInactive EQU 0x00 ; active flag disabled -kEFISystemGUID EQU 0x3BC93EC9 ; last 4 bytes of EFI System Partition Type GUID: - ; C12A7328-F81F-11D2-BA4B-00A0C93EC93B -kBasicDataGUID EQU 0xC79926B7 ; last 4 bytes of Basic Data System Partition Type GUID: - ; EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 - -; -; Format of fdisk partition entry. -; -; The symbol 'part_size' is automatically defined as an `EQU' -; giving the size of the structure. -; - struc part -.bootid resb 1 ; bootable or not -.head resb 1 ; starting head, sector, cylinder -.sect resb 1 ; -.cyl resb 1 ; -.type resb 1 ; partition type -.endhead resb 1 ; ending head, sector, cylinder -.endsect resb 1 ; -.endcyl resb 1 ; -.lba resd 1 ; starting lba -.sectors resd 1 ; size in sectors - endstruc - -; -; Format of GPT Partition Table Header -; - struc gpth -.Signature resb 8 -.Revision resb 4 -.HeaderSize resb 4 -.HeaderCRC32 resb 4 -.Reserved resb 4 -.MyLBA resb 8 -.AlternateLBA resb 8 -.FirstUsableLBA resb 8 -.LastUsableLBA resb 8 -.DiskGUID resb 16 -.PartitionEntryLBA resb 8 -.NumberOfPartitionEntries resb 4 -.SizeOfPartitionEntry resb 4 -.PartitionEntryArrayCRC32 resb 4 - endstruc - -; -; Format of GUID Partition Entry Array -; - struc gpta -.PartitionTypeGUID resb 16 -.UniquePartitionGUID resb 16 -.StartingLBA resb 8 -.EndingLBA resb 8 -.Attributes resb 8 -.PartitionName resb 72 - endstruc - -; -; Macros. -; -%macro DebugCharMacro 1 - mov al, %1 - call print_char -%endmacro - -%macro LogString 1 - mov di, %1 - call log_string -%endmacro - -%if DEBUG -%define DebugChar(x) DebugCharMacro x -%else -%define DebugChar(x) -%endif - -;-------------------------------------------------------------------------- -; Start of text segment. - - SEGMENT .text - - ORG kBoot0RelocAddr - -;-------------------------------------------------------------------------- -; Boot code is loaded at 0:7C00h. -; -start: - ; - ; Set up the stack to grow down from kBoot0Segment:kBoot0Stack. - ; Interrupts should be off while the stack is being manipulated. - ; - cli ; interrupts off - xor ax, ax ; zero ax - mov ss, ax ; ss <- 0 - mov sp, kBoot0Stack ; sp <- top of stack - sti ; reenable interrupts - - mov es, ax ; es <- 0 - mov ds, ax ; ds <- 0 - - ; - ; Relocate boot0 code. - ; - mov si, kBoot0LoadAddr ; si <- source - mov di, kBoot0RelocAddr ; di <- destination - cld ; auto-increment SI and/or DI registers - mov cx, kSectorBytes/2 ; copy 256 words - repnz movsw ; repeat string move (word) operation - - ; - ; Code relocated, jump to start_reloc in relocated location. - ; - jmp kBoot0Segment:start_reloc - -;-------------------------------------------------------------------------- -; Start execution from the relocated location. -; -start_reloc: - - DebugChar('>') - -%if DEBUG - mov al, dl - call print_hex -%endif - - ; - ; Since this code may not always reside in the MBR, always start by - ; loading the MBR to kMBRBuffer and LBA1 to kGPTBuffer. - ; - - xor eax, eax - mov [my_lba], eax ; store LBA sector 0 for read_lba function - mov al, 2 ; load two sectors: MBR and LBA1 - mov bx, kMBRBuffer ; MBR load address - call load - jc error ; MBR load error - - ; - ; Look for the booter partition in the MBR partition table, - ; which is at offset kMBRPartTable. - ; - mov si, kMBRPartTable ; pointer to partition table - call find_boot ; will not return on success - -error: - LogString(boot_error_str) - -hang: - hlt - jmp hang - - -;-------------------------------------------------------------------------- -; Find the active (boot) partition and load the booter from the partition. -; -; Arguments: -; DL = drive number (0x80 + unit number) -; SI = pointer to fdisk partition table. -; -; Clobber list: -; EAX, BX, EBP -; -find_boot: - - ; - ; Check for boot block signature 0xAA55 following the 4 partition - ; entries. - ; - cmp WORD [si + part_size * kPartCount], kBootSignature - jne .exit ; boot signature not found. - - xor bx, bx ; BL will be set to 1 later in case of - ; Protective MBR has been found - -.start_scan: - mov cx, kPartCount ; number of partition entries per table - -.loop: - - ; - ; First scan through the partition table looking for the active - ; partition. - ; -%if DEBUG - mov al, [si + part.type] ; print partition type - call print_hex -%endif - - mov eax, [si + part.lba] ; save starting LBA of current - mov [my_lba], eax ; MBR partition entry for read_lba function - cmp BYTE [si + part.type], 0 ; unused partition? - je .continue ; skip to next entry - cmp BYTE [si + part.type], kPartTypePMBR ; check for Protective MBR - jne .tryToBootIfActive - - mov BYTE [si + part.bootid], kPartInactive ; found Protective MBR - ; clear active flag to make sure this protective - ; partition won't be used as a bootable partition. - mov bl, 1 ; Assume we can deal with GPT but try to scan - ; later if not found any other bootable partitions. - -.tryToBootIfActive: - ; We're going to try to boot a partition if it is active - cmp BYTE [si + part.bootid], kPartActive - jne .continue - - ; - ; Found boot partition, read boot sector to memory. - ; - - xor dh, dh ; Argument for loadBootSector to skip file system signature check. - call loadBootSector - jne .continue - jmp SHORT initBootLoader - -.continue: - add si, BYTE part_size ; advance SI to next partition entry - loop .loop ; loop through all partition entries - - ; - ; Scanned all partitions but not found any with active flag enabled - ; Anyway if we found a protective MBR before we still have a chance - ; for a possible GPT Header at LBA 1 - ; - dec bl - jnz .exit ; didn't find Protective MBR before - call checkGPT - -.exit: - ret ; Giving up. - - - ; - ; Jump to partition booter. The drive number is already in register DL. - ; SI is pointing to the modified partition entry. - ; -initBootLoader: - -DebugChar('J') - -%if VERBOSE - LogString(done_str) -%endif - - jmp kBoot0LoadAddr - - ; - ; Found Protective MBR Partition Type: 0xEE - ; Check for 'EFI PART' string at the beginning - ; of LBA1 for possible GPT Table Header - ; -checkGPT: - push bx - - mov di, kLBA1Buffer ; address of GUID Partition Table Header - cmp DWORD [di], kGPTSignatureLow ; looking for 'EFI ' - jne .exit ; not found. Giving up. - cmp DWORD [di + 4], kGPTSignatureHigh ; looking for 'PART' - jne .exit ; not found. Giving up indeed. - mov si, di - - ; - ; Loading GUID Partition Table Array - ; - mov eax, [si + gpth.PartitionEntryLBA] ; starting LBA of GPT Array - mov [my_lba], eax ; save starting LBA for read_lba function - mov cx, [si + gpth.NumberOfPartitionEntries] ; number of GUID Partition Array entries - mov bx, [si + gpth.SizeOfPartitionEntry] ; size of GUID Partition Array entry - - push bx ; push size of GUID Partition entry - - ; - ; Current GPT Arrays uses 128 partition entries each 128 bytes long - ; 128 entries * 128 bytes long GPT Array entries / 512 bytes per sector = 32 sectors - ; - mov al, 32 ; maximum sector size of GPT Array (hardcoded method) - - mov bx, kGPTABuffer - push bx ; push address of GPT Array - call load ; read GPT Array - pop si ; SI = address of GPT Array - pop bx ; BX = size of GUID Partition Array entry - jc error - - ; - ; Walk through GUID Partition Table Array - ; and load boot record from first supported partition. - ; - ; If it has boot signature (0xAA55) then jump to it - ; otherwise skip to next partition. - ; - -%if VERBOSE - LogString(gpt_str) -%endif - -.gpt_loop: - - mov eax, [si + gpta.PartitionTypeGUID + kGUIDLastDwordOffs] - - ; - ; Try EFI System Partition - ; - cmp eax, kEFISystemGUID ; check current GUID Partition for EFI System Partition GUID type - je .gpt_ok - - ; - ; Also try FAT2 System Partition - ; - cmp eax, kBasicDataGUID ; check current GUID Partition for Basic Data Partition GUID type - jne .gpt_continue - -.gpt_ok: - ; - ; Found a possible good partition try to boot it - ; - - mov eax, [si + gpta.StartingLBA] ; load boot sector from StartingLBA - mov [my_lba], eax - mov dh, 1 ; Argument for loadBootSector to check file system signature. - call loadBootSector - jne .gpt_continue ; no boot loader signature - - mov si, kMBRPartTable ; fake the current GUID Partition - mov [si + part.lba], eax ; as MBR style partition for boot1f32, - mov BYTE [si + part.type], kPartTypeFAT32 ; set filesystem type for cosmetic reasons - jmp SHORT initBootLoader - -.gpt_continue: - - add si, bx ; advance SI to next partition entry - loop .gpt_loop ; loop through all partition entries - -.exit: - pop bx - ret ; no more GUID partitions. Giving up. - - -;-------------------------------------------------------------------------- -; loadBootSector - Load boot sector -; -; Arguments: -; DL = drive number (0x80 + unit number) -; DH = 0 skip file system signature checking -; 1 enable file system signature checking -; [my_lba] = starting LBA. -; -; Returns: -; ZF = 0 if boot sector hasn't kBootSignature -; 1 if boot sector has kBootSignature -; -loadBootSector: - pusha - - mov al, 3 - mov bx, kBoot0LoadAddr - call load - jc error - - or dh, dh - jz .checkBootSignature - -%if VERBOSE - LogString(test_str) -%endif - - ; - ; Looking for boot1f32 magic string. - ; - mov ax, [kBoot0LoadAddr + kFAT32BootCodeOffset] - cmp ax, kBoot1FAT32Magic - jne .exit - -.checkBootSignature: - ; - ; Check for boot block signature 0xAA55 - ; - cmp WORD [kBoot0LoadAddr + kSectorBytes - 2], kBootSignature - -.exit: - - popa - - ret - - -;-------------------------------------------------------------------------- -; load - Load one or more sectors from a partition. -; -; Arguments: -; AL = number of 512-byte sectors to read. -; ES:BX = pointer to where the sectors should be stored. -; DL = drive number (0x80 + unit number) -; [my_lba] = starting LBA. -; -; Returns: -; CF = 0 success -; 1 error -; -load: - push cx - -.ebios: - mov cx, 5 ; load retry count -.ebios_loop: - call read_lba ; use INT13/F42 - jnc .exit - loop .ebios_loop - -.exit: - pop cx - ret - - -;-------------------------------------------------------------------------- -; read_lba - Read sectors from a partition using LBA addressing. -; -; Arguments: -; AL = number of 512-byte sectors to read (valid from 1-127). -; ES:BX = pointer to where the sectors should be stored. -; DL = drive number (0x80 + unit number) -; [my_lba] = starting LBA. -; -; Returns: -; CF = 0 success -; 1 error -; -read_lba: - pushad ; save all registers - mov bp, sp ; save current SP - - ; - ; Create the Disk Address Packet structure for the - ; INT13/F42 (Extended Read Sectors) on the stack. - ; - -; push DWORD 0 ; offset 12, upper 32-bit LBA - push ds ; For sake of saving memory, - push ds ; push DS register, which is 0. - mov ecx, [my_lba] ; offset 8, lower 32-bit LBA - push ecx - push es ; offset 6, memory segment - push bx ; offset 4, memory offset - xor ah, ah ; offset 3, must be 0 - push ax ; offset 2, number of sectors - - ; It pushes 2 bytes with a smaller opcode than if WORD was used - push BYTE 16 ; offset 0-1, packet size - - DebugChar('<') -%if DEBUG - mov eax, ecx - call print_hex -%endif - - ; - ; INT13 Func 42 - Extended Read Sectors - ; - ; Arguments: - ; AH = 0x42 - ; DL = drive number (80h + drive unit) - ; DS:SI = pointer to Disk Address Packet - ; - ; Returns: - ; AH = return status (sucess is 0) - ; carry = 0 success - ; 1 error - ; - ; Packet offset 2 indicates the number of sectors read - ; successfully. - ; - mov si, sp - mov ah, 0x42 - int 0x13 - - jnc .exit - - DebugChar('R') ; indicate INT13/F42 error - - ; - ; Issue a disk reset on error. - ; Should this be changed to Func 0xD to skip the diskette controller - ; reset? - ; - xor ax, ax ; Func 0 - int 0x13 ; INT 13 - stc ; set carry to indicate error - -.exit: - mov sp, bp ; restore SP - popad - ret - - -;-------------------------------------------------------------------------- -; Write a string with 'boot0: ' prefix to the console. -; -; Arguments: -; ES:DI pointer to a NULL terminated string. -; -; Clobber list: -; DI -; -log_string: - pusha - - push di - mov si, log_title_str - call print_string - - pop si - call print_string - - popa - - ret - - -;-------------------------------------------------------------------------- -; Write a string to the console. -; -; Arguments: -; DS:SI pointer to a NULL terminated string. -; -; Clobber list: -; AX, BX, SI -; -print_string: - mov bx, 1 ; BH=0, BL=1 (blue) - cld ; increment SI after each lodsb call -.loop: - lodsb ; load a byte from DS:SI into AL - cmp al, 0 ; Is it a NULL? - je .exit ; yes, all done - mov ah, 0xE ; INT10 Func 0xE - int 0x10 ; display byte in tty mode - jmp short .loop -.exit: - ret - - -%if DEBUG - -;-------------------------------------------------------------------------- -; Write a ASCII character to the console. -; -; Arguments: -; AL = ASCII character. -; -print_char: - pusha - mov bx, 1 ; BH=0, BL=1 (blue) - mov ah, 0x0e ; bios INT 10, Function 0xE - int 0x10 ; display byte in tty mode - popa - ret - - -;-------------------------------------------------------------------------- -; Write the 4-byte value to the console in hex. -; -; Arguments: -; EAX = Value to be displayed in hex. -; -print_hex: - pushad - mov cx, WORD 4 - bswap eax -.loop: - push ax - ror al, 4 - call print_nibble ; display upper nibble - pop ax - call print_nibble ; display lower nibble - ror eax, 8 - loop .loop - - mov al, 10 ; carriage return - call print_char - mov al, 13 - call print_char - - popad - ret - -print_nibble: - and al, 0x0f - add al, '0' - cmp al, '9' - jna .print_ascii - add al, 'A' - '9' - 1 -.print_ascii: - call print_char - ret - -getc: - pusha - mov ah, 0 - int 0x16 - popa - ret -%endif ;DEBUG - - -;-------------------------------------------------------------------------- -; NULL terminated strings. -; - -%if VERBOSE -gpt_str db 'GPT', 0 -test_str db 'test', 0 -done_str db 'done', 0 -%endif - -boot_error_str db 'error', 0 - -;-------------------------------------------------------------------------- -; Pad the rest of the 512 byte sized booter with zeroes. The last -; two bytes is the mandatory boot sector signature. -; -; If the booter code becomes too large, then nasm will complain -; that the 'times' argument is negative. - -; -; According to EFI specification, maximum boot code size is 440 bytes -; - -pad_boot: - times 428-($-$$) db 0 ; 428 = 440 - len(log_title_str) - -log_title_str: - db 10, 13, 'boot0af: ', 0 ; can be use as signature - -pad_table_and_sig: - times 510-($-$$) db 0 - dw kBootSignature - - ABSOLUTE 0xE400 - -; -; In memory variables. -; -my_lba resd 1 ; Starting LBA for read_lba function - -; END diff --git a/Utilities/BootInstall/bootsrc/boot1f32.nasm b/Utilities/BootInstall/bootsrc/boot1f32.nasm deleted file mode 100644 index 897e070a..00000000 --- a/Utilities/BootInstall/bootsrc/boot1f32.nasm +++ /dev/null @@ -1,603 +0,0 @@ -; Copyright (c) 1999-2003 Apple Computer, Inc. All rights reserved. -; -; @APPLE_LICENSE_HEADER_START@ -; -; Portions Copyright (c) 1999-2003 Apple Computer, Inc. All Rights -; Reserved. This file contains Original Code and/or Modifications of -; Original Code as defined in and that are subject to the Apple Public -; Source License Version 2.0 (the "License"). You may not use this file -; except in compliance with the License. Please obtain a copy of the -; License at http://www.apple.com/publicsource and read it before using -; this file. -; -; The Original Code and all software distributed under the License are -; distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER -; EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, -; INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, -; FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the -; License for the specific language governing rights and limitations -; under the License. -; -; @APPLE_LICENSE_HEADER_END@ -; -; Partition Boot Loader: boot1f32 -; -; This program is designed to reside in sector 0 of a FAT32 partition. -; It expects that the MBR has left the drive number in DL -; and a pointer to the partition entry in SI. -; -; This version requires a BIOS with EBIOS (LBA) support. -; -; This code is written for the NASM assembler. -; nasm boot1f32.s -o boot1f32 -; -; dd if=origbs of=newbs skip=3 seek=3 bs=1 count=87 conv=notrunc -; - -; -; This version of boot1f32 tries to find a stage2 boot file in the root folder. -; -; Written by mackerintel on 2009-01-26 -; - -; -; Set to 1 to enable obscure debug messages. -; -DEBUG EQU 0 - -; -; Set to 1 to enable verbose mode. -; -VERBOSE EQU 0 - -; -; Various constants. -; -NULL EQU 0 -CR EQU 0x0D -LF EQU 0x0A - -maxSectorCount EQU 64 ; maximum sector count for readSectors -kSectorBytes EQU 512 ; sector size in bytes -kBootSignature EQU 0xAA55 ; boot sector signature - -kBoot1StackAddress EQU 0xFFF0 ; boot1 stack pointer -kBoot1LoadAddr EQU 0x7C00 ; boot1 load address -kBoot1RelocAddr EQU 0xE000 ; boot1 relocated address - -kBoot2Sectors EQU (480 * 1024 - 512) / kSectorBytes ; max size of 'boot' file in sectors -kBoot2Segment EQU 0x2000 ; boot2 load segment -kBoot2Address EQU kSectorBytes ; boot2 load address - -FATBUF EQU 0x7000 ; Just place for one sectors -DIRBUFSEG EQU 0x1000 ; Cluster sizes >64KB aren't supported - -; -; Format of fdisk partition entry. -; -; The symbol 'part_size' is automatically defined as an `EQU' -; giving the size of the structure. -; - struc part -.bootid resb 1 ; bootable or not -.head resb 1 ; starting head, sector, cylinder -.sect resb 1 ; -.cyl resb 1 ; -.type resb 1 ; partition type -.endhead resb 1 ; ending head, sector, cylinder -.endsect resb 1 ; -.endcyl resb 1 ; -.lba resd 1 ; starting lba -.sectors resd 1 ; size in sectors - endstruc - - struc direntry -.nameext resb 11 -.attr resb 1 -.nused1 resb 8 -.highclus resw 1 -.nused2 resb 4 -.lowclus resw 1 -.size resd 1 - endstruc - - -; -; Macros. -; -%macro jmpabs 1 - push WORD %1 - ret -%endmacro - -%macro DebugCharMacro 1 - pushad - mov al, %1 - call print_char - call getc - popad -%endmacro - -%macro PrintCharMacro 1 - pushad - mov al, %1 - call print_char - popad -%endmacro - -%macro PutCharMacro 1 - call print_char -%endmacro - -%macro PrintHexMacro 1 - call print_hex -%endmacro - -%macro PrintString 1 - mov si, %1 - call print_string -%endmacro - -%macro LogString 1 - mov di, %1 - call log_string -%endmacro - -%if DEBUG - %define DebugChar(x) DebugCharMacro x - %define PrintChar(x) PrintCharMacro x - %define PutChar(x) PutCharMacro - %define PrintHex(x) PrintHexMacro x -%else - %define DebugChar(x) - %define PrintChar(x) - %define PutChar(x) - %define PrintHex(x) -%endif - -;-------------------------------------------------------------------------- -; Start of text segment. - - SEGMENT .text - - ORG kBoot1LoadAddr - - jmp start - times 3-($-$$) nop - -gOEMName times 8 db 0 ;OEMNAME -gBPS dw 0 -gSPC db 0 -gReservedSectors dw 0 -gNumFats db 0 -gCrap1 times 11 db 0 -gPartLBA dd 0 -gPartSize dd 0 -gSectPerFat dd 0 -gCrap2 times 4 db 0 -gRootCluster dd 0 -gCrap3 times 16 db 0 - -gBIOSDriveNumber db 0 -gExtInfo times 25 db 0 -gFileName db "BOOT " ; Used as a magic string in boot0 - -;-------------------------------------------------------------------------- -; Boot code is loaded at 0:7C00h. -; -start: - ; - ; set up the stack to grow down from kBoot1StackSegment:kBoot1StackAddress. - ; Interrupts should be off while the stack is being manipulated. - ; - cli ; interrupts off - xor eax, eax ; zero ax - mov ss, ax ; ss <- 0 - mov sp, kBoot1StackAddress ; sp <- top of stack - sti ; reenable interrupts - - mov ds, ax ; ds <- 0 - mov es, ax ; es <- 0 - - ; - ; Initializing global variables. - ; - mov ax, word [gReservedSectors] - add eax, [si + part.lba] - mov [gPartLBA], eax ; save the current FAT LBA offset - mov [gBIOSDriveNumber], dl ; save BIOS drive number - xor eax,eax - mov al, [gNumFats] - mul dword [gSectPerFat] - mov [gSectPerFat], eax - -;-------------------------------------------------------------------------- -; Find stage2 boot file in a FAT32 Volume's root folder. -; -findRootBoot: - -%if VERBOSE - LogString(init_str) -%endif - - mov eax, [gRootCluster] - -nextdirclus: - mov edx, DIRBUFSEG<<4 - call readCluster - jc error - xor si, si - mov bl, [gSPC] - shl bx, 9 - add bx, si - -nextdirent: - mov di, gFileName - push ds - push DIRBUFSEG - pop ds - mov cl, [si] - test cl, cl - jz dserror - mov cx, 11 - repe cmpsb - jz direntfound - -falsealert: - pop ds - add cl, 21 - add si, cx - cmp si, bx - jz nextdirclus - jmp nextdirent - -direntfound: - lodsb - test al, 0x18 - jnz falsealert - push WORD [si + direntry.highclus - 12] - push WORD [si + direntry.lowclus - 12] - pop eax - pop ds - mov edx, (kBoot2Segment << 4) + kBoot2Address - -cont_read: - push edx - call readCluster - pop edx - pushf - xor ebx,ebx - mov bl, [gSPC] - shl ebx, 9 - add edx, ebx - popf - jnc cont_read - -boot2: - -%if DEBUG - DebugChar ('!') -%endif - - mov dl, [gBIOSDriveNumber] ; load BIOS drive number - jmp kBoot2Segment:kBoot2Address - -dserror: - pop ds - -error: - -%if VERBOSE - LogString(error_str) -%endif - -hang: - hlt - jmp hang - - ; readCluster - Reads cluster EAX to (EDX), updates EAX to next cluster -readCluster: - cmp eax, 0x0ffffff8 - jb do_read - stc - ret - -do_read: - push eax - xor ecx,ecx - dec eax - dec eax - mov cl, [gSPC] - push edx - mul ecx - pop edx - add eax, [gSectPerFat] - mov ecx, eax - xor ah,ah - mov al, [gSPC] - call readSectors - jc clusend - pop ecx - push cx - shr ecx, 7 - xor ax, ax - inc ax - mov edx, FATBUF - call readSectors - jc clusend - pop si - and si, 0x7f - shl si, 2 - mov eax, [FATBUF + si] - and eax, 0x0fffffff - clc - ret - -clusend: - pop eax - ret - -;-------------------------------------------------------------------------- -; readSectors - Reads more than 127 sectors using LBA addressing. -; -; Arguments: -; AX = number of 512-byte sectors to read (valid from 1-1280). -; EDX = pointer to where the sectors should be stored. -; ECX = sector offset in partition -; -; Returns: -; CF = 0 success -; 1 error -; -readSectors: - pushad - mov bx, ax - -.loop: - xor eax, eax ; EAX = 0 - mov al, bl ; assume we reached the last block. - cmp bx, maxSectorCount ; check if we really reached the last block - jb .readBlock ; yes, BX < MaxSectorCount - mov al, maxSectorCount ; no, read MaxSectorCount - -.readBlock: - call readLBA - sub bx, ax ; decrease remaning sectors with the read amount - jz .exit ; exit if no more sectors left to be loaded - add ecx, eax ; adjust LBA sector offset - shl ax, 9 ; convert sectors to bytes - add edx, eax ; adjust target memory location - jmp .loop ; read remaining sectors - -.exit: - popad - ret - -;-------------------------------------------------------------------------- -; readLBA - Read sectors from a partition using LBA addressing. -; -; Arguments: -; AL = number of 512-byte sectors to read (valid from 1-127). -; EDX = pointer to where the sectors should be stored. -; ECX = sector offset in partition -; [bios_drive_number] = drive number (0x80 + unit number) -; -; Returns: -; CF = 0 success -; 1 error -; -readLBA: - pushad ; save all registers - push es ; save ES - mov bp, sp ; save current SP - - ; - ; Convert EDX to segment:offset model and set ES:BX - ; - ; Some BIOSes do not like offset to be negative while reading - ; from hard drives. This usually leads to "boot1: error" when trying - ; to boot from hard drive, while booting normally from USB flash. - ; The routines, responsible for this are apparently different. - ; Thus we split linear address slightly differently for these - ; capricious BIOSes to make sure offset is always positive. - ; - - mov bx, dx ; save offset to BX - and bh, 0x0f ; keep low 12 bits - shr edx, 4 ; adjust linear address to segment base - xor dl, dl ; mask low 8 bits - mov es, dx ; save segment to ES - - ; - ; Create the Disk Address Packet structure for the - ; INT13/F42 (Extended Read Sectors) on the stack. - ; - - ; push DWORD 0 ; offset 12, upper 32-bit LBA - push ds ; For sake of saving memory, - push ds ; push DS register, which is 0. - - add ecx, [gPartLBA] ; offset 8, lower 32-bit LBA - push ecx - - push es ; offset 6, memory segment - - push bx ; offset 4, memory offset - - xor ah, ah ; offset 3, must be 0 - push ax ; offset 2, number of sectors - - push WORD 16 ; offset 0-1, packet size - - ; - ; INT13 Func 42 - Extended Read Sectors - ; - ; Arguments: - ; AH = 0x42 - ; [bios_drive_number] = drive number (0x80 + unit number) - ; DS:SI = pointer to Disk Address Packet - ; - ; Returns: - ; AH = return status (sucess is 0) - ; carry = 0 success - ; 1 error - ; - ; Packet offset 2 indicates the number of sectors read - ; successfully. - ; - mov dl, [gBIOSDriveNumber] ; load BIOS drive number - mov si, sp - mov ah, 0x42 - int 0x13 - - jc error - - ; - ; Issue a disk reset on error. - ; Should this be changed to Func 0xD to skip the diskette controller - ; reset? - ; -; xor ax, ax ; Func 0 -; int 0x13 ; INT 13 -; stc ; set carry to indicate error - -.exit: - mov sp, bp ; restore SP - pop es ; restore ES - popad - ret - -%if VERBOSE - -;-------------------------------------------------------------------------- -; Write a string with 'boot1: ' prefix to the console. -; -; Arguments: -; ES:DI pointer to a NULL terminated string. -; -; Clobber list: -; DI -; -log_string: - pushad - - push di - mov si, log_title_str - call print_string - - pop si - call print_string - - popad - - ret - -;------------------------------------------------------------------------- -; Write a string to the console. -; -; Arguments: -; DS:SI pointer to a NULL terminated string. -; -; Clobber list: -; AX, BX, SI -; -print_string: - mov bx, 1 ; BH=0, BL=1 (blue) - -.loop: - lodsb ; load a byte from DS:SI into AL - cmp al, 0 ; Is it a NULL? - je .exit ; yes, all done - mov ah, 0xE ; INT10 Func 0xE - int 0x10 ; display byte in tty mode - jmp .loop - -.exit: - ret - -%endif ; VERBOSE - -%if DEBUG - -;-------------------------------------------------------------------------- -; Write the 4-byte value to the console in hex. -; -; Arguments: -; EAX = Value to be displayed in hex. -; -print_hex: - pushad - mov cx, WORD 4 - bswap eax -.loop: - push ax - ror al, 4 - call print_nibble ; display upper nibble - pop ax - call print_nibble ; display lower nibble - ror eax, 8 - loop .loop - - popad - ret - -print_nibble: - and al, 0x0f - add al, '0' - cmp al, '9' - jna .print_ascii - add al, 'A' - '9' - 1 -.print_ascii: - call print_char - ret - -;-------------------------------------------------------------------------- -; getc - wait for a key press -; -getc: - pushad - mov ah, 0 - int 0x16 - popad - ret - -;-------------------------------------------------------------------------- -; Write a ASCII character to the console. -; -; Arguments: -; AL = ASCII character. -; -print_char: - pushad - mov bx, 1 ; BH=0, BL=1 (blue) - mov ah, 0x0e ; bios INT 10, Function 0xE - int 0x10 ; display byte in tty mode - popad - ret - -%endif ; DEBUG - -;-------------------------------------------------------------------------- -; Static data. -; - -%if VERBOSE -log_title_str db CR, LF, 'b1f: ', NULL -init_str db 'init', NULL -error_str db 'error', NULL -%endif - -;-------------------------------------------------------------------------- -; Pad the rest of the 512 byte sized sector with zeroes. The last -; two bytes is the mandatory boot sector signature. -; -; If the booter code becomes too large, then nasm will complain -; that the 'times' argument is negative. - -pad_table_and_sig: - times 510-($-$$) db 0 - dw kBootSignature - - ABSOLUTE kBoot1LoadAddr + kSectorBytes - -; END diff --git a/Utilities/Duet/EfiLdrImage b/Utilities/Duet/EfiLdrImage deleted file mode 100755 index 2e0a89f2..00000000 Binary files a/Utilities/Duet/EfiLdrImage and /dev/null differ diff --git a/Utilities/Duet/GenPage b/Utilities/Duet/GenPage deleted file mode 100755 index 070ed4e6..00000000 Binary files a/Utilities/Duet/GenPage and /dev/null differ