diff options
author | rsc <rsc> | 2009-05-31 01:00:38 +0000 |
---|---|---|
committer | rsc <rsc> | 2009-05-31 01:00:38 +0000 |
commit | e97519a6d2efd56eb5b5ff2e4c4b20048a33c7af (patch) | |
tree | ede9368cea8ba44c70d35ced9e754d3da5a35bb5 | |
parent | ba6cd8a685cdf86f308ba8c8cd1faa39adf86fa5 (diff) | |
download | xv6-labs-e97519a6d2efd56eb5b5ff2e4c4b20048a33c7af.tar.gz xv6-labs-e97519a6d2efd56eb5b5ff2e4c4b20048a33c7af.tar.bz2 xv6-labs-e97519a6d2efd56eb5b5ff2e4c4b20048a33c7af.zip |
sync with c; .text is implied
-rw-r--r-- | bootasm.S | 21 | ||||
-rw-r--r-- | trapasm.S | 20 | ||||
-rwxr-xr-x | vectors.pl | 2 |
3 files changed, 25 insertions, 18 deletions
@@ -5,15 +5,16 @@ # memory at physical address 0x7c00 and starts executing in real mode # with %cs=0 %ip=7c00. -.set CSEG32, 0x8 # kernel code segment selector -.set DSEG32, 0x10 # kernel data segment selector -.set CR0_PE, 0x1 # protected mode enable flag +#define SEG_KCODE 1 // kernel code +#define SEG_KDATA 2 // kernel data+stack +#define SEG_KCPU 3 // kernel per-cpu data + +#define CR0_PE 1 // protected mode enable bit .code16 # Assemble for 16-bit mode .globl start start: cli # Disable interrupts - cld # String operations increment # Set up the important data segment registers (DS, ES, SS). xorw %ax,%ax # Segment number zero @@ -53,18 +54,19 @@ seta20.2: # Jump to next instruction, but in 32-bit code segment. # Switches processor into 32-bit mode. - ljmp $CSEG32, $start32 + ljmp $(SEG_KCODE<<3), $start32 .code32 # Assemble for 32-bit mode start32: # Set up the protected-mode data segment registers - movw $DSEG32, %ax # Our data segment selector + movw $(SEG_KDATA<<3), %ax # Our data segment selector movw %ax, %ds # -> DS: Data Segment movw %ax, %es # -> ES: Extra Segment + movw %ax, %ss # -> SS: Stack Segment + movw $(SEG_KCPU<<3), %ax # Our per-cpu segment selector movw %ax, %fs # -> FS movw %ax, %gs # -> GS - movw %ax, %ss # -> SS: Stack Segment - + # Set up the stack pointer and call into C. movl $start, %esp call bootmain @@ -85,7 +87,8 @@ gdt: SEG_NULLASM # null seg SEG_ASM(STA_X|STA_R, 0x0, 0xffffffff) # code seg SEG_ASM(STA_W, 0x0, 0xffffffff) # data seg + SEG_ASM(STA_W, 0x100, 0xffffffff) # per-cpu data seg; 0x100 is okay for now gdtdesc: - .word 0x17 # sizeof(gdt) - 1 + .word 0x1f # sizeof(gdt) - 1 .long gdt # address gdt @@ -1,6 +1,6 @@ -.text - -.set SEG_KDATA_SEL, 0x10 # selector for SEG_KDATA +#define SEG_KCODE 1 // kernel code +#define SEG_KDATA 2 // kernel data+stack +#define SEG_KCPU 3 // kernel per-cpu data # vectors.S sends all traps here. .globl alltraps @@ -12,10 +12,16 @@ alltraps: pushl %gs pushal - # Set up data segments. - movl $SEG_KDATA_SEL, %eax - movw %ax,%ds - movw %ax,%es + # Set up data and per-cpu segments. + # Can find out KDATA from %ss. + # Assume that KCPU is KDATA+1. + movw $(SEG_KDATA<<3), %ax + movw %ss, %ax + movw %ax, %ds + movw %ax, %es + movw $(SEG_KCPU<<3), %ax + movw %ax, %fs + movw %ax, %gs # Call trap(tf), where tf=%esp pushl %esp @@ -7,7 +7,6 @@ print "# generated by vectors.pl - do not edit\n"; print "# handlers\n"; -print ".text\n"; print ".globl alltraps\n"; for(my $i = 0; $i < 256; $i++){ print ".globl vector$i\n"; @@ -29,7 +28,6 @@ for(my $i = 0; $i < 256; $i++){ # sample output: # # handlers -# .text # .globl alltraps # .globl vector0 # vector0: |