15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* -*-Asm-*- */ 25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * GRUB -- GRand Unified Bootloader 45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Copyright (C) 1999,2000,2001,2002,2004 Free Software Foundation, Inc. 55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This program is free software; you can redistribute it and/or modify 75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * it under the terms of the GNU General Public License as published by 85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the Free Software Foundation; either version 2 of the License, or 95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * (at your option) any later version. 105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This program is distributed in the hope that it will be useful, 125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * GNU General Public License for more details. 155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * You should have received a copy of the GNU General Public License 175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * along with this program; if not, write to the Free Software 185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <stage1.h> 225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * defines for the code go here 255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Absolute addresses 285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project This makes the assembler generate the address without support 295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project from the linker. (ELF can't relocate 16-bit addresses!) */ 305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ABS(x) (x-_start+0x7c00) 315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Print message string */ 335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MSG(x) movw $ABS(x), %si; call message 345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* XXX: binutils-2.9.1.0.x doesn't produce a short opcode for this. */ 365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MOV_MEM_TO_AL(x) .byte 0xa0; .word x 375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .file "stage1.S" 395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .text 415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Tell GAS to generate 16-bit instructions so that this code works 435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project in real mode. */ 445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .code16 455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project.globl _start; _start: 475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * _start is loaded at 0x7c00 and is jumped to with CS:IP 0:0x7c00 495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Beginning of the sector is compatible with the FAT/HPFS BIOS 535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * parameter block. 545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp after_BPB 575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project nop /* do I care about this ??? */ 585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This space is for the BIOS parameter block!!!! Don't change 615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the first jump, nor start the code anywhere but right after 625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * this area. 635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project . = _start + 4 665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* scratch space */ 685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmode: 695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .byte 0 705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdisk_address_packet: 715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectsectors: 725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .long 0 735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectheads: 745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .long 0 755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcylinders: 765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .word 0 775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectsector_start: 785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .byte 0 795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthead_start: 805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .byte 0 815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcylinder_start: 825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .word 0 835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* more space... */ 845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project . = _start + STAGE1_BPBEND 865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * End of BIOS parameter block. 895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstage1_version: 925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .byte COMPAT_VERSION_MAJOR, COMPAT_VERSION_MINOR 935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectboot_drive: 945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .byte GRUB_INVALID_DRIVE /* the disk to load stage2 from */ 955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectforce_lba: 965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .byte 0 975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstage2_address: 985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .word 0x8000 995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstage2_sector: 1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .long 1 1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstage2_segment: 1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .word 0x800 1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectafter_BPB: 1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* general setup */ 1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cli /* we're not safe here! */ 1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This is a workaround for buggy BIOSes which don't pass boot 1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * drive correctly. If GRUB is installed into a HDD, check if 1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * DL is masked correctly. If not, assume that the BIOS passed 1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * a bogus value and set DL to 0x80, since this is the only 1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * possible boot drive. If GRUB is installed into a floppy, 1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * this does nothing (only jump). 1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectboot_drive_check: 1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp 1f 1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project testb $0x80, %dl 1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jnz 1f 1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb $0x80, %dl 1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1: 1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ljmp to the next instruction because some bogus BIOSes 1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * jump to 07C0:0000 instead of 0000:7C00. 1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ljmp $0, $ABS(real_start) 1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectreal_start: 1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* set up %ds and %ss as offset from 0 */ 1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xorw %ax, %ax 1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw %ax, %ds 1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw %ax, %ss 1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* set up the REAL stack */ 1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw $STAGE1_STACKSEG, %sp 1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sti /* we're safe again */ 1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Check if we have a forced disk reference here 1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MOV_MEM_TO_AL(ABS(boot_drive)) /* movb ABS(boot_drive), %al */ 1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cmpb $GRUB_INVALID_DRIVE, %al 1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project je 1f 1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb %al, %dl 1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1: 1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* save drive reference first thing! */ 1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pushw %dx 1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* print a notification message on the screen */ 1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MSG(notification_string) 1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* do not probe LBA if the drive is a floppy */ 1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project testb $STAGE1_BIOS_HD_FLAG, %dl 1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jz chs_mode 1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* check if LBA is supported */ 1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb $0x41, %ah 1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw $0x55aa, %bx 1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int $0x13 1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * %dl may have been clobbered by INT 13, AH=41H. 1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This happens, for example, with AST BIOS 1.04. 1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project popw %dx 1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pushw %dx 1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* use CHS if fails */ 1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jc chs_mode 1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cmpw $0xaa55, %bx 1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jne chs_mode 1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* check if AH=0x42 is supported if FORCE_LBA is zero */ 1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MOV_MEM_TO_AL(ABS(force_lba)) /* movb ABS(force_lba), %al */ 1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project testb %al, %al 1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jnz lba_mode 1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project andw $1, %cx 1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jz chs_mode 1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectlba_mode: 1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* save the total number of sectors */ 1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl 0x10(%si), %ecx 1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* set %si to the disk address packet */ 1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw $ABS(disk_address_packet), %si 1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* set the mode to non-zero */ 1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb $1, -1(%si) 1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl ABS(stage2_sector), %ebx 1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* the size and the reserved byte */ 1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw $0x0010, (%si) 1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* the blocks */ 2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw $1, 2(%si) 2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* the absolute address (low 32 bits) */ 2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl %ebx, 8(%si) 2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* the segment of buffer address */ 2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw $STAGE1_BUFFERSEG, 6(%si) 2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xorl %eax, %eax 2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw %ax, 4(%si) 2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl %eax, 12(%si) 2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * BIOS call "INT 0x13 Function 0x42" to read sectors from disk into memory 2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Call with %ah = 0x42 2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * %dl = drive number 2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * %ds:%si = segment:offset of disk address packet 2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Return: 2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * %al = 0x0 on success; err code on failure 2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb $0x42, %ah 2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int $0x13 2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* LBA read is not supported, so fallback to CHS. */ 2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jc chs_mode 2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw $STAGE1_BUFFERSEG, %bx 2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp copy_buffer 2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectchs_mode: 2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Determine the hard disk geometry from the BIOS! 2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * We do this first, so that LS-120 IDE floppies work correctly. 2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb $8, %ah 2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int $0x13 2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jnc final_init 2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * The call failed, so maybe use the floppy probe instead. 2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project testb $STAGE1_BIOS_HD_FLAG, %dl 2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jz floppy_probe 2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Nope, we definitely have a hard disk, and we're screwed. */ 2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp hd_probe_error 2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfinal_init: 2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw $ABS(sectors), %si 2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* set the mode to zero */ 2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb $0, -1(%si) 2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* save number of heads */ 2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xorl %eax, %eax 2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb %dh, %al 2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project incw %ax 2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl %eax, 4(%si) 2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xorw %dx, %dx 2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb %cl, %dl 2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project shlw $2, %dx 2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb %ch, %al 2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb %dh, %ah 2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* save number of cylinders */ 2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project incw %ax 2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw %ax, 8(%si) 2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xorw %ax, %ax 2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb %dl, %al 2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project shrb $2, %al 2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* save number of sectors */ 2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl %eax, (%si) 2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectsetup_sectors: 2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* load logical sector start (bottom half) */ 2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl ABS(stage2_sector), %eax 2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* zero %edx */ 2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xorl %edx, %edx 2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* divide by number of sectors */ 2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project divl (%si) 2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* save sector start */ 2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb %dl, 10(%si) 2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xorl %edx, %edx /* zero %edx */ 2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project divl 4(%si) /* divide by number of heads */ 2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* save head start */ 2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb %dl, 11(%si) 2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* save cylinder start */ 2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw %ax, 12(%si) 2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* do we need too many cylinders? */ 3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cmpw 8(%si), %ax 3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jge geometry_error 3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This is the loop for taking care of BIOS geometry translation (ugh!) 3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* get high bits of cylinder */ 3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb 13(%si), %dl 3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project shlb $6, %dl /* shift left by 6 bits */ 3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb 10(%si), %cl /* get sector */ 3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project incb %cl /* normalize sector (sectors go 3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project from 1-N, not 0-(N-1) ) */ 3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project orb %dl, %cl /* composite together */ 3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb 12(%si), %ch /* sector+hcyl in cl, cylinder in ch */ 3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* restore %dx */ 3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project popw %dx 3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* head number */ 3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb 11(%si), %dh 3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * BIOS call "INT 0x13 Function 0x2" to read sectors from disk into memory 3275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Call with %ah = 0x2 3285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * %al = number of sectors 3295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * %ch = cylinder 3305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * %cl = sector (bits 6-7 are high bits of "cylinder") 3315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * %dh = head 3325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * %dl = drive (0x80 for hard disk, 0x0 for floppy disk) 3335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * %es:%bx = segment:offset of buffer 3345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Return: 3355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * %al = 0x0 on success; err code on failure 3365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 3375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw $STAGE1_BUFFERSEG, %bx 3395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw %bx, %es /* load %es segment with disk buffer */ 3405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xorw %bx, %bx /* %bx = 0, put it at 0 in the segment */ 3425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw $0x0201, %ax /* function 2 */ 3435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int $0x13 3445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jc read_error 3465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw %es, %bx 3485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcopy_buffer: 3505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw ABS(stage2_segment), %es 3515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 3535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * We need to save %cx and %si because the startup code in 3545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * stage2 uses them without initializing them. 3555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 3565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pusha 3575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pushw %ds 3585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw $0x100, %cx 3605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw %bx, %ds 3615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xorw %si, %si 3625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xorw %di, %di 3635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cld 3655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rep 3675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movsw 3685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project popw %ds 3705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project popa 3715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* boot stage2 */ 3735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp *(stage2_address) 3745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* END OF MAIN LOOP */ 3765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 3785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * BIOS Geometry translation error (past the end of the disk geometry!). 3795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 3805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgeometry_error: 3815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MSG(geometry_error_string) 3825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp general_error 3835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 3855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Disk probe failure. 3865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 3875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthd_probe_error: 3885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MSG(hd_probe_error_string) 3895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp general_error 3905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 3925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Read error on the disk. 3935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 3945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectread_error: 3955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MSG(read_error_string) 3965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgeneral_error: 3985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MSG(general_error_string) 3995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* go here when you need to stop the machine hard after an error condition */ 4015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstop: jmp stop 4025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnotification_string: .string "GRUB " 4045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgeometry_error_string: .string "Geom" 4055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthd_probe_error_string: .string "Hard Disk" 4065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectread_error_string: .string "Read" 4075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgeneral_error_string: .string " Error" 4085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 4105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * message: write the string pointed to by %si 4115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 4125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * WARNING: trashes %si, %ax, and %bx 4135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 4145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 4165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Use BIOS "int 10H Function 0Eh" to write character in teletype mode 4175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * %ah = 0xe %al = character 4185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * %bh = page %bl = foreground color (graphics modes) 4195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 4205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1: 4215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw $0x0001, %bx 4225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb $0xe, %ah 4235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int $0x10 /* display a byte */ 4245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmessage: 4255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project lodsb 4265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cmpb $0, %al 4275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jne 1b /* if not end of string, jmp to display */ 4285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ret 4295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 4315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Windows NT breaks compatibility by embedding a magic 4325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * number here. 4335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 4345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project . = _start + STAGE1_WINDOWS_NT_MAGIC 4365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnt_magic: 4375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .long 0 4385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .word 0 4395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 4415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This is where an MBR would go if on a hard disk. The code 4425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * here isn't even referenced unless we're on a floppy. Kinda 4435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * sneaky, huh? 4445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 4455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectpart_start: 4475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project . = _start + STAGE1_PARTSTART 4485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprobe_values: 4505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .byte 36, 18, 15, 9, 0 4515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfloppy_probe: 4535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 4545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Perform floppy probe. 4555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 4565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw $ABS(probe_values-1), %si 4585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprobe_loop: 4605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* reset floppy controller INT 13h AH=0 */ 4615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xorw %ax, %ax 4625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int $0x13 4635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project incw %si 4655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb (%si), %cl 4665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* if number of sectors is 0, display error and die */ 4685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cmpb $0, %cl 4695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jne 1f 4705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 4725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Floppy disk probe failure. 4735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 4745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MSG(fd_probe_error_string) 4755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp general_error 4765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfd_probe_error_string: .string "Floppy" 4785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1: 4805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* perform read */ 4815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw $STAGE1_BUFFERSEG, %bx 4825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movw $0x201, %ax 4835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb $0, %ch 4845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb $0, %dh 4855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int $0x13 4865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* if error, jump to "probe_loop" */ 4885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jc probe_loop 4895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* %cl is already the correct value! */ 4915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb $1, %dh 4925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb $79, %ch 4935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp final_init 4955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project . = _start + STAGE1_PARTEND 4975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* the last 2 bytes in the sector 0 contain the signature */ 4995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .word STAGE1_SIGNATURE 500