diff options
Diffstat (limited to 'memdisk/memdisk.inc')
-rw-r--r-- | memdisk/memdisk.inc | 69 |
1 files changed, 64 insertions, 5 deletions
diff --git a/memdisk/memdisk.inc b/memdisk/memdisk.inc index 14f077ab..98ad52b7 100644 --- a/memdisk/memdisk.inc +++ b/memdisk/memdisk.inc @@ -8,6 +8,7 @@ ; ; Copyright 2001-2009 H. Peter Anvin - All Rights Reserved ; Copyright 2009 Intel Corporation; author: H. Peter Anvin +; Portions copyright 2009 Shao Miller [El Torito code] ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by @@ -135,6 +136,10 @@ Int13Start: mov ss,ax mov sp,[cs:MyStack] +%if ELTORITO + cmp word [cs:SavedAX],4a00h ; El Torito function? + jae our_drive ; We grab it +%endif ; See if DL points to our class of device (FD, HD) push dx push dx @@ -205,6 +210,14 @@ our_drive: ; Note: AX == P_AX here cmp ah,Int13FuncsCnt-1 ja Invalid_jump +%if ELTORITO + mov al,[CD_PKT.type] ; Check if we are in + cmp al,0 ; El Torito no emulation mode + ja .emulation ; No. We support the function + cmp ah,3fh ; Yes. We must not support functions + jbe Invalid_jump ; 0 through 3Fh. Check and decide +.emulation: +%endif xor al,al ; AL = 0 is standard entry condition mov di,ax shr di,7 ; Convert AH to an offset in DI @@ -393,8 +406,9 @@ EDDPresence: jne Invalid mov P_BX,0AA55h ; EDD signature mov P_AX,03000h ; EDD 3.0 - mov P_CX,0003h ; Bit 0 - Fixed disk access subset + mov P_CX,0007h ; Bit 0 - Fixed disk access subset ; Bit 1 - Locking and ejecting subset + ; Bit 2 - EDD subset pop ax ; Drop return address xor ax,ax ; Success jmp DoneWeird ; Success, but AH != 0, sigh... @@ -575,10 +589,31 @@ edd_setup_regs: EDDEject: mov ax,0B200h ; Volume Not Removable ret - +%if ELTORITO +ElToritoTerminate: + TRACER 'T' + mov ax,[cs:SavedAX] + cmp al,1 ; We only support query, not terminate + jne ElToritoErr ; Fail + mov es,P_DS ; Caller's DS:SI pointed to packet + mov di,P_SI ; We'll use ES:DI + mov si,CD_PKT.size ; First byte is packet size + xor cx,0 ; Empty our count + ;mov cl,[ds:si] ; We'll copy that many bytes + mov cl,13h + rep movsb ; Copy until CX is zero + mov ax,0 ; Success + ret +ElToritoEmulate: +ElToritoBoot: +ElToritoCatalog: +ElToritoErr: + TRACER '!' + mov ax,100h ; Invalid parameter + ret +%endif ; ELTORITO %endif ; EDD - ; ; INT 15h intercept routines ; @@ -960,7 +995,14 @@ Int13Funcs dw Reset ; 00h - RESET dw EDDSeek ; 47h - EDD SEEK dw EDDGetParms ; 48h - EDD GET PARAMETERS dw EDDDetectChange ; 49h - EDD MEDIA CHANGE STATUS -%endif +%if ELTORITO ; EDD El Torito Functions + ; ELTORITO _must_ also have EDD + dw ElToritoEmulate ; 4Ah - Initiate Disk Emulation + dw ElToritoTerminate ; 4Bh - Terminate Disk Emulation + dw ElToritoBoot ; 4Ch - Initiate Disk Emu. and Reboot + dw ElToritoCatalog ; 4Dh - Return Boot Catalog +%endif ; ELTORITO +%endif ; EDD Int13FuncsEnd equ $ Int13FuncsCnt equ (Int13FuncsEnd-Int13Funcs) >> 1 @@ -1070,7 +1112,24 @@ EDD_DPT: .res3 db 0 ; Reserved .chksum db 0 ; DPI checksum -%endif +%if ELTORITO +; El Torito CD Specification Packet - mostly filled in by installer +CD_PKT: +.size db 13h ; Packet size (19 bytes) +.type db 0 ; Boot media type (flags) +.driveno db 0E0h ; INT 13h drive number +.controller db 0 ; Controller index +.start dd 0 ; Starting LBA of image +.devno dw 0 ; Device number +.user_buf dw 0 ; User buffer segment +.load_seg dw 0 ; Load segment +.sect_count dw 0 ; Emulated sectors to load +.geom1 db 0 ; Cylinders bits 0 thru 7 +.geom2 db 0 ; Sects/track 0 thru 5, cyls 8, 9 +.geom3 db 0 ; Heads +%endif ; ELTORITO + +%endif ; EDD ; End patch area alignb 4, db 0 |