15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * GRUB -- GRand Unified Bootloader 35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Copyright (C) 1994-2002 H. Peter Anvin 45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Copyright (C) 1999,2000,2001,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 225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project Most of this file was originally "isolinux.asm" from SYSLINUX package. 245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project It has been very heavily modified. 255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/ 265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ASM_FILE 285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "stage1.h" 295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "shared.h" 305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "iso9660.h" 315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef STAGE1_5 335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "stage2_size.h" 345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Absolute addresses 385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project This makes the assembler generate the address without support 395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project from the linker. (ELF can't relocate 16-bit addresses!) */ 405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ABS(x) (x-_start+BOOTSEC_LOCATION) 415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef STAGE1_5 435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# define STAGE_ADDR 0x2000 445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else 455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# define STAGE_ADDR 0x8000 465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* STAGE1_5 */ 475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Print message string */ 495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MSG(x) mov $ABS(x), %si; call message; 505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .file "start_eltorito.S" 525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .text 545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Tell GAS to generate 16-bit instructions so that this code works 565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project in real mode. */ 575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .code16 585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .globl start, _start 605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Primary entry point. Because BIOSes are buggy, we only load the first 635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * CD-ROM sector (2K) of the file, so the number one priority is actually 645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * loading the rest. 655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstart: 675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project_start: 685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cli 695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ljmp $0, $ABS(real_start) 705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project . = _start + 8 /* Pad to file offset 8 */ 725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* This table gets filled in by mkisofs using the 745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project -boot-info-table option */ 755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbi_pvd: .long 0xDEADBEEF /* LBA of primary volume descript */ 765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbi_file: .long 0xDEADBEEF /* LBA of boot file */ 775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbi_length: .long 0xDEADBEEF /* Length of boot file */ 785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbi_csum: .long 0xDEADBEEF /* Checksum of boot file */ 795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbi_reserved: .space (10*4) /* Reserved */ 805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectreal_start: 825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xor %ax, %ax 835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %ax, %ss 845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %ax, %ds 855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %ax, %es 865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %ax, %fs 875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %ax, %gs 885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov $STAGE1_STACKSEG, %sp /* set up the REAL stack */ 895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sti 905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cld 915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* save drive reference first thing! */ 935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %dl, ABS(BootDrive) 945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* print a notification message on the screen */ 965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MSG(notification_string) 975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectload_image: 995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Set up boot file sector, size, load address */ 1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov ABS(bi_length), %eax 1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project add $(ISO_SECTOR_SIZE-1), %eax 1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project shr $ISO_SECTOR_BITS, %eax /* dwords->sectors */ 1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %ax, %bp /* boot file sectors */ 1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov $(STAGE_ADDR >> 4), %bx 1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %bx, %es 1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xor %bx, %bx 1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov ABS(bi_file), %eax 1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project call getlinsec 1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %ds, %ax 1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %ax, %es 1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MSG(notification_done) 1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbootit: 1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* save the sector number of the second sector in %ebp */ 1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov $ABS(firstlist - BOOTSEC_LISTSIZE), %si 1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov (%si), %ebp 1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov ABS(BootDrive), %dl /* this makes sure %dl is our "boot" drive */ 1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ljmp $0, $(STAGE_ADDR+SECTOR_SIZE) /* jump to main() in asm.S */ 1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* go here when you need to stop the machine hard after an error condition */ 1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstop: jmp stop 1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Get linear sectors - EBIOS LBA addressing, 2048-byte sectors. 1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Note that we can't always do this as a single request, because at least 1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Phoenix BIOSes has a 127-sector limit. To be on the safe side, stick 1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * to 16 sectors (32K) per request. 1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Input: 1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * EAX - Linear sector number 1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ES:BX - Target buffer 1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * BP - Sector count 1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgetlinsec: 1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov $ABS(dapa), %si /* Load up the DAPA */ 1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %bx, 4(%si) 1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %es, %bx 1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %bx, 6(%si) 1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %eax, 8(%si) 1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1: 1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project push %bp 1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project push %si 1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cmp ABS(MaxTransfer), %bp 1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jbe 2f 1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov ABS(MaxTransfer), %bp 1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project2: 1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %bp, 2(%si) 1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov ABS(BootDrive), %dl 1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov $0x42, %ah /* Extended Read */ 1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project call xint13 1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pop %si 1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pop %bp 1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movzwl 2(%si), %eax /* Sectors we read */ 1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project add %eax, 8(%si) /* Advance sector pointer */ 1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sub %ax, %bp /* Sectors left */ 1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project shl $(ISO_SECTOR_BITS-4), %ax /* 2048-byte sectors -> segment */ 1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project add %ax, 6(%si) /* Advance buffer pointer */ 1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pushal 1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MSG(notification_step) 1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project popal 1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cmp $0, %bp 1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ja 1b 1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov 8(%si), %eax /* Return next sector */ 1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ret 1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * INT 13h with retry 1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectxint13: 1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movb $6, ABS(RetryCount) 1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pushal 1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project.try: 1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int $0x13 1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jc 1f 1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project add $(8*4), %sp /* Clean up stack */ 1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ret 1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1: 1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %ah, %dl /* Save error code */ 1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project decb ABS(RetryCount) 1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jz .real_error 1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov ABS(RetryCount), %al 1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov ABS(dapa+2), %ah /* Sector transfer count */ 1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cmp $2, %al /* Only 2 attempts left */ 1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ja 2f 1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov $1, %ah /* Drop transfer size to 1 */ 1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp .setmaxtr 1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project2: 1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cmp $3, %al 1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ja 3f /* First time, just try again */ 1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project shr $1, %ah /* Otherwise, try to reduce */ 1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project adc $0, %ah /* the max transfer size, but not */ 1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project.setmaxtr: 1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %ah, ABS(MaxTransfer) 1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %ah, ABS(dapa+2) 1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project3: 1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project popal 2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp .try 2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project.real_error: 2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MSG(read_error_string) 2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov %dl, %al 2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project call printhex2 2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project popal 2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp stop 2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * message: write the string pointed to by %si 2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * WARNING: trashes %si, %ax, and %bx 2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Use BIOS "int 10H Function 0Eh" to write character in teletype mode 2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * %ah = 0xe %al = character 2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * %bh = page %bl = foreground color (graphics modes) 2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1: 2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov $0x0001, %bx 2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov $0x0E, %ah 2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int $0x10 /* display a byte */ 2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmessage: 2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project lodsb 2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project or %al, %al 2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jne 1b /* if not end of string, jmp to display */ 2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ret 2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * printhex[248]: Write a hex number in (AL, AX, EAX) to the console 2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprinthex2: 2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pushal 2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rol $24, %eax 2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov $2, %cx 2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp 1f 2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprinthex4: 2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pushal 2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rol $16, %eax 2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov $4, %cx 2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp 1f 2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprinthex8: 2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pushal 2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov $8, %cx 2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1: 2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rol $4, %eax 2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project push %eax 2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project and $0x0F, %al 2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cmp $10, %al 2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jae .high 2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project.low: add $('0'), %al 2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp 2f 2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project.high: add $('A'-10), %al 2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project2: 2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov $0x0001, %bx 2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mov $0x0E, %ah 2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int $0x10 /* display a char */ 2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pop %eax 2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project loop 1b 2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project popal 2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ret 2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/**************************************************************************/ 2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef STAGE1_5 2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnotification_string: .string "Loading stage1.5 " 2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else 2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnotification_string: .string "Loading stage2 " 2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnotification_step: .string "." 2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnotification_done: .string "\r\n" 2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectread_error_string: .string "Read error 0x" 2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * EBIOS disk address packet 2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .align 8 2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdapa: .byte 16 /* Packet size */ 2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .byte 0 /* reserved */ 2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .word 0 /* +2 Block count */ 2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .word 0 /* +4 Offset of buffer */ 2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .word 0 /* +6 Segment of buffer */ 2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .long 0 /* +8 LBA (LSW) */ 2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .long 0 /* +C LBA (MSW) */ 2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectVARIABLE(BootDrive) 2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .byte 0xFF 2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectVARIABLE(MaxTransfer) 2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .word 16 /* Max sectors per transfer (32Kb) */ 2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectVARIABLE(RetryCount) 2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .byte 0 2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This area is an empty space between the main body of code below which 3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * grows up (fixed after compilation, but between releases it may change 3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * in size easily), and the lists of sectors to read, which grows down 3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * from a fixed top location. 3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .word 0 3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .word 0 3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project . = _start + SECTOR_SIZE - BOOTSEC_LISTSIZE 3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* fill the first data listing with the default */ 3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectblocklist_default_start:/* this is the sector start parameter, in logical 3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sectors from the start of the disk, sector 0 */ 3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .long 0 3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectblocklist_default_len: /* this is the number of sectors to read */ 3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef STAGE1_5 3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .word 0 3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else 3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .word (STAGE2_SIZE + ISO_SECTOR_SIZE - 1) >> ISO_SECTOR_BITS 3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectblocklist_default_seg: /* this is the segment of the starting address 3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project to load the data into */ 3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project .word (STAGE_ADDR + SECTOR_SIZE) >> 4 3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfirstlist: /* this label has to be after the list data!!! */ 327