From e97519a6d2efd56eb5b5ff2e4c4b20048a33c7af Mon Sep 17 00:00:00 2001 From: rsc Date: Sun, 31 May 2009 01:00:38 +0000 Subject: [PATCH] sync with c; .text is implied --- bootasm.S | 21 ++++++++++++--------- trapasm.S | 20 +++++++++++++------- vectors.pl | 2 -- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/bootasm.S b/bootasm.S index e29abcf..9c4a9b2 100644 --- a/bootasm.S +++ b/bootasm.S @@ -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 diff --git a/trapasm.S b/trapasm.S index 962ba10..59fca57 100644 --- a/trapasm.S +++ b/trapasm.S @@ -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 diff --git a/vectors.pl b/vectors.pl index 51bddd1..57b49dd 100755 --- a/vectors.pl +++ b/vectors.pl @@ -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: