Fix extended_primary_loader for native CD boot
When the extended primary loader for CD was introduced in 2008-2009 it used to load a relatively small secondary loader. Later the secondary loader was integrated into the kernel, hence the primary loader had to load the kernel which is 100kB+. The EDD BIOS specification allows to read less than 0x80 sectors at once using Int 0x13 0x42 service. For a 512-byte sector this is less than 0x10000 bytes which is a 64kB limit. The same limit of 64kB is reached on a CD with only 0x20 sectors, because the sector size is 2048 bytes here. This commit changes the maximum number of sectors that can be read by the loader at once from 0x7f to 0x20, i.e. reading is done in 64kB blocks now.
This commit is contained in:
@@ -170,9 +170,10 @@ read_sectors:
|
|||||||
do_read_sectors:
|
do_read_sectors:
|
||||||
push ax
|
push ax
|
||||||
push cx
|
push cx
|
||||||
cmp cx, 0x7F
|
; read no more than 64kB at once, i.e. 0x20 sectors
|
||||||
|
cmp cx, 0x20
|
||||||
jbe @f
|
jbe @f
|
||||||
mov cx, 0x7F
|
mov cx, 0x20
|
||||||
@@:
|
@@:
|
||||||
; create disk address packet on the stack
|
; create disk address packet on the stack
|
||||||
; dq starting LBA
|
; dq starting LBA
|
||||||
@@ -182,7 +183,7 @@ do_read_sectors:
|
|||||||
; dd buffer
|
; dd buffer
|
||||||
push es
|
push es
|
||||||
push bx
|
push bx
|
||||||
; dw number of blocks to transfer (no more than 0x7F)
|
; dw number of blocks to transfer (no more than 0x20)
|
||||||
push cx
|
push cx
|
||||||
; dw packet size in bytes
|
; dw packet size in bytes
|
||||||
push 10h
|
push 10h
|
||||||
|
@@ -156,10 +156,12 @@
|
|||||||
es:bx указывает на конец буфера, в который были прочитаны данные
|
es:bx указывает на конец буфера, в который были прочитаны данные
|
||||||
если произошла ошибка чтения, флаг CF установлен
|
если произошла ошибка чтения, флаг CF установлен
|
||||||
1. В цикле (шаги 2-4) читает секторы, следит за тем, чтобы на каждой итерации
|
1. В цикле (шаги 2-4) читает секторы, следит за тем, чтобы на каждой итерации
|
||||||
число читаемых секторов не превосходило 7Fh (требование спецификации
|
число читаемых секторов не превосходило 20h. Требование спецификации
|
||||||
EDD BIOS).
|
EDD BIOS не более 7Fh секторов за раз, что почти 64кБ для 512-байтного
|
||||||
2. Если число секторов для чтения больше 7Fh, уменьшает его (для текущей
|
сектора. Однако при размере сектора 2048 байт размер буфера в 64кБ
|
||||||
итерации) до 7Fh.
|
достигается уже при 20h секторах.
|
||||||
|
2. Если число секторов для чтения больше 20h, уменьшает его (для текущей
|
||||||
|
итерации) до 20h.
|
||||||
3. Формирует в стеке пакет для int 13h (кладёт все нужные данные командами
|
3. Формирует в стеке пакет для int 13h (кладёт все нужные данные командами
|
||||||
push, причём в обратном порядке: стек - структура LIFO, и данные в
|
push, причём в обратном порядке: стек - структура LIFO, и данные в
|
||||||
стеке хранятся в обратном порядке по отношению к тому, как их туда
|
стеке хранятся в обратном порядке по отношению к тому, как их туда
|
||||||
|
Reference in New Issue
Block a user