shell: gracefully handle missing data disk
This commit is contained in:
parent
e6b42204ef
commit
02b0317c3b
73
boot.subx
73
boot.subx
|
@ -934,15 +934,10 @@ load-sector-string-from-primary-bus-secondary-drive: # LBAlo: byte, LBAmid: byt
|
||||||
50/push-eax
|
50/push-eax
|
||||||
51/push-ecx
|
51/push-ecx
|
||||||
52/push-edx
|
52/push-edx
|
||||||
# check for floating bus
|
# check for drive
|
||||||
{
|
(secondary-drive-exists?) # => eax
|
||||||
31/xor %eax 0/r32/eax
|
3d/compare-eax-and 0/imm32/false
|
||||||
ba/copy-to-edx 0x1f7/imm32
|
0f 84/jump-if-= $load-sector-string-from-primary-bus-secondary-drive:end/disp32
|
||||||
ec/read-port-dx-into-al
|
|
||||||
81 7/subop/compare %eax 0xff/imm32
|
|
||||||
75/jump-if-!= break/disp8
|
|
||||||
(abort "primary bus has no drives")
|
|
||||||
}
|
|
||||||
# kick off read
|
# kick off read
|
||||||
(ata-drive-select 0xf0) # primary bus, secondary drive; 4 LSBs contain 4 upper bits of LBA (here 0)
|
(ata-drive-select 0xf0) # primary bus, secondary drive; 4 LSBs contain 4 upper bits of LBA (here 0)
|
||||||
(clear-ata-error)
|
(clear-ata-error)
|
||||||
|
@ -982,6 +977,66 @@ $load-sector-string-from-primary-bus-secondary-drive:end:
|
||||||
5d/pop-to-ebp
|
5d/pop-to-ebp
|
||||||
c3/return
|
c3/return
|
||||||
|
|
||||||
|
secondary-drive-exists?: # -> _/eax: boolean
|
||||||
|
# . prologue
|
||||||
|
55/push-ebp
|
||||||
|
89/<- %ebp 4/r32/esp
|
||||||
|
# . save registers
|
||||||
|
52/push-edx
|
||||||
|
# check for floating bus
|
||||||
|
{
|
||||||
|
31/xor %eax 0/r32/eax
|
||||||
|
ba/copy-to-edx 0x1f7/imm32
|
||||||
|
ec/read-port-dx-into-al
|
||||||
|
3d/compare-eax-and 0xff/imm32
|
||||||
|
# if eax is 0xff, primary bus has no drives
|
||||||
|
b8/copy-to-eax 0/imm32/false
|
||||||
|
74/jump-if-= $secondary-drive-exists?:end/disp8
|
||||||
|
}
|
||||||
|
# identify
|
||||||
|
(ata-drive-select 0xb0) # primary bus, secondary drive
|
||||||
|
(ata-sector-count 0)
|
||||||
|
(ata-lba 0 0 0)
|
||||||
|
(ata-command 0xec) # identify
|
||||||
|
# read status register
|
||||||
|
# TODO: might need to spin here for 400ns: https://wiki.osdev.org/index.php?title=ATA_PIO_Mode&oldid=25664#400ns_delays
|
||||||
|
31/xor %eax 0/r32/eax
|
||||||
|
ba/copy-to-edx 0x1f7/imm32
|
||||||
|
ec/read-port-dx-into-al
|
||||||
|
# if eax is 0, secondary drive does not exist
|
||||||
|
3d/compare-eax-and 0/imm32
|
||||||
|
{
|
||||||
|
74/jump-if-= break/disp8
|
||||||
|
b8/copy-to-eax 1/imm32/true
|
||||||
|
eb/jump $secondary-drive-exists?:complete-identify/disp8
|
||||||
|
}
|
||||||
|
# TODO: might need to perform remaining steps at https://wiki.osdev.org/index.php?title=ATA_PIO_Mode&oldid=25664#IDENTIFY_command
|
||||||
|
b8/copy-to-eax 0/imm32/false
|
||||||
|
$secondary-drive-exists?:complete-identify:
|
||||||
|
50/push-eax
|
||||||
|
# clear FIFO from the drive
|
||||||
|
ba/copy-to-edx 0x1f0/imm32
|
||||||
|
b9/copy-to-ecx 0x200/imm32
|
||||||
|
{
|
||||||
|
81 7/subop/compare %ecx 0/imm32
|
||||||
|
74/jump-if-= break/disp8
|
||||||
|
# read 4 bytes
|
||||||
|
ed/read-port-dx-into-eax
|
||||||
|
49/decrement-ecx
|
||||||
|
49/decrement-ecx
|
||||||
|
49/decrement-ecx
|
||||||
|
49/decrement-ecx
|
||||||
|
eb/jump loop/disp8
|
||||||
|
}
|
||||||
|
58/pop-to-eax
|
||||||
|
$secondary-drive-exists?:end:
|
||||||
|
# . restore registers
|
||||||
|
5a/pop-to-edx
|
||||||
|
# . epilogue
|
||||||
|
89/<- %esp 5/r32/ebp
|
||||||
|
5d/pop-to-ebp
|
||||||
|
c3/return
|
||||||
|
|
||||||
ata-drive-select: # n: byte
|
ata-drive-select: # n: byte
|
||||||
# . prologue
|
# . prologue
|
||||||
55/push-ebp
|
55/push-ebp
|
||||||
|
|
|
@ -7,19 +7,24 @@ Currently runs a tiny subset of Lisp. Steps to run it from the top-level:
|
||||||
$ ./translate shell/*.mu # generates disk.img
|
$ ./translate shell/*.mu # generates disk.img
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Create a data disk:
|
2. Run it:
|
||||||
|
```sh
|
||||||
|
$ qemu-system-i386 disk.img
|
||||||
|
```
|
||||||
|
|
||||||
|
To save typing in a large s-expression, create a secondary disk for data:
|
||||||
```sh
|
```sh
|
||||||
$ dd if=/dev/zero of=data.img count=20160
|
$ dd if=/dev/zero of=data.img count=20160
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Optionally load an s-expression into the disk:
|
Load an s-expression into it:
|
||||||
```sh
|
```sh
|
||||||
$ echo '(+ 1 1)' |dd of=data.img conv=notrunc
|
$ echo '(+ 1 1)' |dd of=data.img conv=notrunc
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Run it:
|
4. Now run with both code and data disks:
|
||||||
```sh
|
```sh
|
||||||
$ qemu-system-i386 disk.img
|
$ qemu-system-i386 -hda disk.img -hdb data.img
|
||||||
```
|
```
|
||||||
|
|
||||||
You can type in expressions, hit `ctrl-s` to see their results, and hit `Tab`
|
You can type in expressions, hit `ctrl-s` to see their results, and hit `Tab`
|
||||||
|
|
Loading…
Reference in New Issue