X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthreads%2Floader.S;h=ca79cdfda730cf75ba173750feb1aa76d0776bc2;hb=a28c932b5562c40fd3ab36adcf21084b91eb46cc;hp=d1e8309c5f194ec47ca996cf7c7c00fae1e96013;hpb=2b587fff05da3f0ca9d008809c7928fc59559bc8;p=pintos-anon diff --git a/src/threads/loader.S b/src/threads/loader.S index d1e8309..ca79cdf 100644 --- a/src/threads/loader.S +++ b/src/threads/loader.S @@ -68,15 +68,16 @@ start: cli cld -# Set up data segments and stack. +# Set up data segments. subw %ax, %ax movw %ax, %es movw %ax, %ds +# Set up stack segment. # Stack grows downward starting from us. -# We don't ever use the stack so this is strictly speaking -# unnecessary. +# We don't ever use the stack, but we call into the BIOS, +# which might. movw %ax, %ss movw $0x7c00, %sp @@ -116,12 +117,13 @@ start: movb $0x88, %ah int $0x15 jc panic + cli # BIOS might have enabled interrupts addl $1024, %eax # Total kB memory cmp $0x10000, %eax # Cap at 64 MB jbe 1f mov $0x10000, %eax 1: shrl $2, %eax # Total 4 kB pages - movl %eax, ram_pages + movl %eax, ram_pgs #### Create temporary page directory and page table and set page #### directory base register. @@ -136,7 +138,9 @@ start: # Add PDEs to point to PTEs for the first 64 MB of RAM. # Also add identical PDEs starting at LOADER_PHYS_BASE. -# See [IA32-v3] section 3.7.6 for a description of the bits in %eax. +# See [IA32-v3a] section 3.7.6 "Page-Directory and Page-Table Entries" +# for a description of the bits in %eax. + movl $0x11007, %eax movl $0x11, %ecx @@ -148,7 +152,8 @@ start: loop 1b # Set up one-to-map linear to physical map for the first 64 MB of RAM. -# See [IA32-v3] section 3.7.6 for a description of the bits in %eax. +# See [IA32-v3a] section 3.7.6 "Page-Directory and Page-Table Entries" +# for a description of the bits in %eax. movw $0x1100, %ax movw %ax, %es @@ -167,11 +172,9 @@ start: #### Switch to protected mode. -# First we turn off interrupts because we don't set up an IDT. - - cli +# Note that interrupts are still off. -# Then we point the GDTR to our GDT. Protected mode requires a GDT. +# Point the GDTR to our GDT. Protected mode requires a GDT. # We need a data32 prefix to ensure that all 32 bits of the GDT # descriptor are loaded (default is to load only 24 bits). @@ -217,6 +220,17 @@ start: movl $1, %ebx movl $LOADER_KERN_BASE + LOADER_PHYS_BASE, %edi + +# Disable interrupt delivery by IDE controller, because we will be +# polling for data. +# (If we don't do this, Bochs 2.2.6 will never deliver any IDE +# interrupt to us later after we reset the interrupt controller during +# boot, even if we also reset the IDE controller.) + + movw $0x3f6, %dx + movb $0x02, %al + outb %al, %dx + read_sector: # Poll status register while controller busy. @@ -295,10 +309,10 @@ gdtdesc: .long gdt + LOADER_PHYS_BASE # address gdt #### Fatal error. -#### Print panicmsg (with help from the BIOS) and spin. +#### Print panic_message (with help from the BIOS) and spin. panic: .code16 # We only panic in real mode. - movw $panicmsg, %si + movw $panic_message, %si movb $0xe, %ah subb %bh, %bh 1: lodsb @@ -307,22 +321,27 @@ panic: .code16 # We only panic in real mode. int $0x10 jmp 1b -panicmsg: - .ascii "Loader panic!\r\n" +panic_message: + .ascii "Panic!" .byte 0 -#### Memory size in 4 kB pages. - .org LOADER_RAM_PAGES - LOADER_BASE -ram_pages: +#### Physical memory size in 4 kB pages. +#### This is initialized by the loader and read by the kernel. + .org LOADER_RAM_PGS - LOADER_BASE +ram_pgs: .long 0 -#### Command-line arguments inserted by another utility. -#### The loader doesn't use these, but we note their -#### location here for easy reference. - .org LOADER_CMD_LINE - LOADER_BASE -cmd_line: +#### Command-line arguments and their count. +#### This is written by the `pintos' utility and read by the kernel. +#### The loader itself does not do anything with the command line. + .org LOADER_ARG_CNT - LOADER_BASE +arg_cnt: + .long 0 + .org LOADER_ARGS - LOADER_BASE +args: .fill 0x80, 1, 0 -#### Boot-sector signature for BIOS inspection. - .org LOADER_BIOS_SIG - LOADER_BASE +#### Boot-sector signature. +#### The BIOS checks that this is set properly. + .org LOADER_SIG - LOADER_BASE .word 0xaa55