projects
/
pintos-anon
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
8d89007
)
Wait for DRQ in status register to transition low before reading
author
Ben Pfaff
<blp@cs.stanford.edu>
Tue, 17 Aug 2004 06:35:16 +0000
(06:35 +0000)
committer
Ben Pfaff
<blp@cs.stanford.edu>
Tue, 17 Aug 2004 06:35:16 +0000
(06:35 +0000)
sector.
src/threads/loader.S
patch
|
blob
|
history
diff --git
a/src/threads/loader.S
b/src/threads/loader.S
index f2563bb149af8b64c46a07473b3ec1d80906cd1c..18086ede8993c44805e6ebe742c64bd2cdc5c524 100644
(file)
--- a/
src/threads/loader.S
+++ b/
src/threads/loader.S
@@
-78,38
+78,53
@@
protcseg:
movl $1, %ebx
movl $0x100000, %edi
movl $1, %ebx
movl $0x100000, %edi
-read_sector:
+read_sector:
+
+ ### Poll status register while controller busy.
movl $0x1f7, %edx
1: inb %dx, %al
testb $0x80, %al
jnz 1b
movl $0x1f7, %edx
1: inb %dx, %al
testb $0x80, %al
jnz 1b
-
+
+ ### Read a single sector.
movl $0x1f2, %edx
movb $1, %al
outb %al, %dx
movl $0x1f2, %edx
movb $1, %al
outb %al, %dx
+ ### Sector number to write in low 28 bits.
+ ### LBA mode, device 0 in top 4 bits.
movl %ebx, %eax
andl $0x0fffffff, %eax
orl $0xe0000000, %eax
movl %ebx, %eax
andl $0x0fffffff, %eax
orl $0xe0000000, %eax
+ ### Dump %eax to ports 0x1f3...0x1f6.
movl $4, %ecx
movl $4, %ecx
-2: inc
l %e
dx
+2: inc
w %
dx
outb %al, %dx
shrl $8, %eax
loop 2b
outb %al, %dx
shrl $8, %eax
loop 2b
+ ### READ command to command register.
incw %dx
movb $0x20, %al
outb %al, %dx
incw %dx
movb $0x20, %al
outb %al, %dx
-
+
+ ### Poll status register while controller busy.
1: inb %dx, %al
testb $0x80, %al
jnz 1b
1: inb %dx, %al
testb $0x80, %al
jnz 1b
+ ### Poll status register until data ready.
+1: inb %dx, %al
+ testb $0x08, %al
+ jz 1b
+
+ ### Transfer sector.
movl $512 / 4, %ecx
movl $0x1f0, %edx
rep insl
movl $512 / 4, %ecx
movl $0x1f0, %edx
rep insl
+ ### Next sector.
incl %ebx
cmpl $KERNEL_LOAD_PAGES*8 + 1, %ebx
jnz read_sector
incl %ebx
cmpl $KERNEL_LOAD_PAGES*8 + 1, %ebx
jnz read_sector