Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
diag/geodsp: Display Geometry based on read
This produces two images that are 8MiB+ in size (in order to exceed the size of the largest CHS cylinder) containing 1 or multiple sectors of code/data and the remaining sectors filled with their LBA.
- Loading branch information
Showing
6 changed files
with
708 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
## ----------------------------------------------------------------------- | ||
## | ||
## Copyright 2010-2011 Gene Cumm | ||
## | ||
## Portions from core/Makefile: | ||
## Copyright 1998-2009 H. Peter Anvin - All Rights Reserved | ||
## Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin | ||
## | ||
## 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 | ||
## the Free Software Foundation, Inc., 53 Temple Place Ste 330, | ||
## Boston MA 02111-1307, USA; either version 2 of the License, or | ||
## (at your option) any later version; incorporated herein by reference. | ||
## | ||
## ----------------------------------------------------------------------- | ||
|
||
# | ||
# Makefile for the SYSLINUX geometry display for diagnostics | ||
# | ||
|
||
topdir = ../.. | ||
# include $(topdir)/MCONFIG.embedded | ||
coredir = $(topdir)/core | ||
|
||
BTARGET = geodsp1s.bin geodspms.bin mk-lba-img \ | ||
geodsp1s.img.xz geodspms.img.xz | ||
# lba-1s.img.xz lba-ms.img.xz | ||
# lba-1s.img lba-ms.img | ||
|
||
NASMOPT = -i $(coredir)/ -Ox -f bin | ||
NASMOPT += -w+orphan-labels | ||
|
||
all: $(BTARGET) | ||
|
||
.PRECIOUS: %.img | ||
# .PRECIOUS: lba-%.img | ||
|
||
# Higher compression levels result in larger files | ||
%.img.xz: %.img | ||
xz -k0f $< | ||
|
||
%.img.gz: %.img | ||
gzip -9c $< > $@ | ||
|
||
%.img: %.bin lba.img | ||
(cp -a lba.img $@ && dd conv=notrunc if=$< of=$@) || rm -f $@ | ||
|
||
%.bin: %.asm $(coredir)/writehex.inc $(coredir)/macros.inc $(coredir)/diskboot.inc | ||
nasm $(NASMOPT) -o $@ -l $(@:.bin=.lst) $< | ||
|
||
mk-lba-img: mk-lba-img.c | ||
gcc -o $@ $< | ||
|
||
lba.img: mk-lba-img | ||
$< $@ | ||
|
||
tidy dist: | ||
rm -Rf *.img | ||
|
||
clean: tidy | ||
rm -f $(BTARGET) *.lst *.bin *_bin.c | ||
|
||
spotless: clean |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
GeoDsp: Images to display the geometry as the BIOS has choosen to interpret it. Both images are intended to be written to the first ~8MiB of a raw device (ie /dev/hda, /dev/sda) and be over one large cylinder of 255*63 512-byte sectors in size. | ||
|
||
GeoDsp1S is a one-sector variant containing all code in one sector that is intended to test behavior with a typical MBR/partition table layout. A partition table should be written after writting an image. | ||
|
||
GeoDspMS is a multi sector variant intended to look like Syslinux installed on a file system on the raw device (as opposed to a file system within a partition). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,269 @@ | ||
; ----------------------------------------------------------------------- | ||
; | ||
; Copyright 2010 Gene Cumm | ||
; | ||
; Portions from diskstart.inc: | ||
; Copyright 1994-2009 H. Peter Anvin - All Rights Reserved | ||
; Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin | ||
; | ||
; 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 | ||
; the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, | ||
; Boston MA 02110-1301, USA; either version 2 of the License, or | ||
; (at your option) any later version; incorporated herein by reference. | ||
; | ||
; ----------------------------------------------------------------------- | ||
|
||
; | ||
; geodsp1s.asm | ||
; | ||
; Display geometry translation info for diagnosing misconceptions | ||
; 1 sector variant | ||
; | ||
; nasm -Ox -f bin -o geodsp.bin -l geodsp.lst geodsp.asm | ||
; | ||
; nasm -Ox -f elf -o geodsp.o -l geodsp.lst geodsp.asm | ||
; ld -m elf_i386 -T syslinux.ld -M -o geodsp.elf geodsp.o > geodsp.map | ||
; objcopy -O binary geodsp.elf geodsp.raw | ||
; | ||
; # OF=/dev/sdb | ||
; # dd if=core/geodsp.bin of=$OF | ||
; # dd skip=1 seek=1 if=../dbg/lba-img/lba-img.bin of=$OF | ||
; # eject $OF | ||
; # dd count=$() if=/dev/zero of=$OF | ||
; | ||
; # OF=geo-2.255.63.i | ||
; # (dd if=core/geodsp.bin; dd skip=1 if=../dbg/lba-img/lba-img.bin; dd count=$((2*255*63 - 256*63 - 1)) if=/dev/zero )|dd of=$OF | ||
; # OF=geo-20.16.63.i | ||
; # (dd if=core/geodsp.bin; dd skip=1 if=../dbg/lba-img/lba-img.bin; dd count=$((40*16*63 - 256*63 - 1)) if=/dev/zero )|dd of=$OF | ||
; | ||
|
||
%include "macros.inc" | ||
; %include "layout.inc" | ||
|
||
; global STACK_LEN, STACK_TOP, STACK_BASE | ||
; STACK_LEN equ 4096 | ||
STACK_TOP equ 7c00h | ||
; STACK_BASE equ STACK_TOP - STACK_LEN | ||
|
||
StackBuf equ STACK_TOP-44-92 ; Start the stack here (grow down - 4K) | ||
DriveNumber equ StackBuf-4 ; Drive number | ||
m_CHS0 equ 00534843h ;'CHS',0 | ||
m_EDD0 equ 00444445h ;'EDD',0 | ||
m_EDD_SP equ 20444445h ;'EDD ' | ||
retry_count equ 16 | ||
dbuf equ 8000h | ||
int13_ret equ 7e00h | ||
|
||
|
||
|
||
; extern real_mode_seg | ||
; section .real_mode write nobits align=65536 | ||
; global core_real_mode | ||
; core_real_mode resb 65536 | ||
; extern xfer_buf_seg | ||
; section .xfer_buf write nobits align=65536 | ||
; global core_xfer_buf | ||
; core_xfer_buf resb 65536 | ||
|
||
section .text | ||
org STACK_TOP | ||
|
||
|
||
global _start | ||
bootsec equ $ | ||
_start: | ||
; In case we want to pull more of the standard diskstart stuff in | ||
; jmp short start ; 2 bytes | ||
; nop ; 1 byte | ||
start: | ||
cli | ||
cld | ||
xor cx,cx | ||
mov ss,cx | ||
mov sp,StackBuf-2 ; Just below BSS (-2 for alignment) | ||
push dx ; Save drive number (in DL) | ||
; Kill everything else and let the BIOS sort it out later | ||
mov es,cx | ||
mov ds,cx | ||
sti | ||
|
||
get_geo: ; DL and ES ready | ||
mov ah,08h | ||
mov di,0 | ||
int 13h | ||
write_geo: | ||
jc .bad_geo | ||
mov si,s_chs | ||
call writestr_early | ||
call write_chs | ||
call crlf | ||
jmp short .done | ||
.bad_geo: | ||
.done: | ||
|
||
mov bx,dbuf | ||
get_h1c: ; 0,1,1 | ||
mov cx,0001h | ||
mov dh,01h | ||
call getonesec_chs | ||
call write_chs_lba | ||
get_c1c: ; 1,0,1 | ||
mov cx,0101h | ||
mov dh,00h | ||
call getonesec_chs | ||
call write_chs_lba | ||
|
||
; | ||
; Do we have EBIOS (EDD)? | ||
; | ||
edd: | ||
.check: | ||
mov bx,55AAh | ||
mov ah,41h ; EDD existence query | ||
mov dl,[DriveNumber] | ||
int 13h | ||
jc .noedd | ||
cmp bx,0AA55h | ||
jne .noedd | ||
test cl,1 ; Extended disk access functionality set | ||
jz .noedd | ||
; | ||
; We have EDD support... | ||
; | ||
mov bx,dbuf | ||
xor edx,edx | ||
mov dword [s_chs],m_EDD_SP | ||
.get_lba63: | ||
mov eax,63 ; Same length as mov al,64; movzx eax,al | ||
call getonesec_ebios | ||
jc .bad_edd ;read error | ||
call write_edd_lba | ||
.get_lba16065: | ||
mov eax,16065 | ||
call getonesec_ebios | ||
jc .bad_edd ;read error | ||
call write_edd_lba | ||
.good_edd: | ||
mov dword [s_type],m_EDD0 | ||
.bad_edd: | ||
.noedd: | ||
.end: | ||
|
||
write_final_type: | ||
mov si,s_typespec | ||
call writestr_early | ||
|
||
jmp short kaboom | ||
|
||
; | ||
; getonesec_ebios: | ||
; | ||
; getonesec implementation for EBIOS (EDD) | ||
; | ||
getonesec_ebios: | ||
mov cx,retry_count | ||
.retry: | ||
; Form DAPA on stack | ||
push edx | ||
push eax | ||
push es | ||
push bx | ||
push word 1 | ||
push word 16 | ||
mov si,sp | ||
pushad | ||
mov ah,42h ; Extended Read | ||
call xint13 | ||
popad | ||
lea sp,[si+16] ; Remove DAPA | ||
jc .error | ||
ret | ||
|
||
.error: | ||
; Some systems seem to get "stuck" in an error state when | ||
; using EBIOS. Doesn't happen when using CBIOS, which is | ||
; good, since some other systems get timeout failures | ||
; waiting for the floppy disk to spin up. | ||
|
||
pushad ; Try resetting the device | ||
xor ax,ax | ||
call xint13 | ||
popad | ||
loop .retry ; CX-- and jump if not zero | ||
|
||
; Total failure. | ||
stc | ||
ret | ||
|
||
; | ||
; getonesec_chs: | ||
; | ||
; CX,DH specifies CHS address | ||
; | ||
getonesec_chs: ; We could use an xchg and get a loop | ||
; mov cx,retry_count | ||
.retry: | ||
pushad | ||
mov ax,0201h ; Read one sector | ||
call xint13 | ||
popad | ||
jc .error | ||
ret | ||
|
||
.error: | ||
; loop .retry | ||
; Fall through to disk_error | ||
; | ||
; kaboom: write a message and bail out. | ||
; | ||
global kaboom | ||
disk_error: | ||
kaboom: | ||
.patch: | ||
mov si,bailmsg | ||
call writestr_early | ||
xor eax,eax | ||
.again: int 16h ; Wait for keypress | ||
; NB: replaced by int 18h if | ||
; chosen at install time.. | ||
int 19h ; And try once more to boot... | ||
.norge: hlt ; If int 19h returned; this is the end | ||
jmp short .norge | ||
|
||
; | ||
; INT 13h wrapper function | ||
; | ||
xint13: | ||
mov dl,[DriveNumber] | ||
int 13h | ||
mov [int13_ret],ax | ||
ret | ||
|
||
; | ||
; | ||
; writestr_early: write a null-terminated string to the console | ||
; This assumes we're on page 0. This is only used for early | ||
; messages, so it should be OK. | ||
; | ||
writestr_early: | ||
pushad | ||
.loop: lodsb | ||
and al,al | ||
jz .return | ||
call writechr | ||
jmp short .loop | ||
.return: popad | ||
ret | ||
|
||
%include "geodsplib.inc" | ||
bailmsg equ s_end | ||
|
||
; This fails if the boot sector overflowsg | ||
zb 1BEh-($-$$) | ||
|
||
ptable zb 40h ; Partition table | ||
|
||
bootsignature dw 0xAA55 | ||
|
||
sector_2: |
Oops, something went wrong.