Changeset 421c833 in mainline for kernel/arch/ia32/src/boot/boot.S


Ignore:
Timestamp:
2009-03-13T12:58:43Z (15 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b6dfc32
Parents:
99d6fd0
Message:

parse VESA mode from a string
unify VESA initialization for ia32 and amd64

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/src/boot/boot.S

    r99d6fd0 r421c833  
    4343        .long MULTIBOOT_HEADER_MAGIC
    4444        .long MULTIBOOT_HEADER_FLAGS
    45         .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)        # checksum
     45        .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)  # checksum
    4646        .long multiboot_header
    4747        .long unmapped_ktext_start
     
    4949        .long 0
    5050        .long multiboot_image_start
    51        
     51
    5252multiboot_image_start:
    5353        cld
    54         movl $START_STACK, %esp                 # initialize stack pointer
    55         lgdt KA2PA(bootstrap_gdtr)              # initialize Global Descriptor Table register
    56 
    57         movw $selector(KDATA_DES), %cx
     54        movl $START_STACK, %esp     # initialize stack pointer
     55        lgdt KA2PA(bootstrap_gdtr)  # initialize Global Descriptor Table register
     56       
     57        movw $gdtselector(KDATA_DES), %cx
    5858        movw %cx, %es
    5959        movw %cx, %fs
    6060        movw %cx, %gs
    61         movw %cx, %ds                                   # kernel data + stack
     61        movw %cx, %ds               # kernel data + stack
    6262        movw %cx, %ss
    6363       
    64         jmpl $selector(KTEXT_DES), $multiboot_meeting_point
     64        jmpl $gdtselector(KTEXT_DES), $multiboot_meeting_point
    6565        multiboot_meeting_point:
    6666       
    67         movl %eax, grub_eax                                     # save parameters from GRUB
     67        movl %eax, grub_eax         # save parameters from GRUB
    6868        movl %ebx, grub_ebx
    6969       
    70         xorl %eax, %eax 
    71         cpuid
    72         cmp $0x0, %eax                                          # any function > 0?
     70        xorl %eax, %eax
     71        cpuid
     72        cmp $0x0, %eax              # any function > 0?
    7373        jbe pse_unsupported
    74         movl $0x1, %eax                                         # Basic function code 1
     74        movl $0x1, %eax             # basic function code 1
    7575        cpuid
    76         bt $3, %edx                                                     # Test if PSE is supported
     76        bt $3, %edx                 # test if PSE is supported
    7777        jc pse_supported
    78 
     78       
    7979        pse_unsupported:
    8080                movl $pse_msg, %esi
     
    8282       
    8383        pse_supported:
    84        
    85 #ifdef CONFIG_FB
    86         mov $vesa_init, %esi
    87         mov $VESA_INIT_SEGMENT << 4, %edi
    88         mov $e_vesa_init - vesa_init, %ecx
    89         rep movsb
    90 
    91         mov $VESA_INIT_SEGMENT << 4, %edi
    92         jmpl *%edi
    93        
    94         vesa_meeting_point:
    95        
    96         mov %esi, KA2PA(vesa_ph_addr)
    97         mov %di, KA2PA(vesa_height)
    98         shr $16, %edi
    99         mov %di, KA2PA(vesa_width)
    100         mov %bx, KA2PA(vesa_scanline)
    101         shr $16, %ebx
    102         mov %bx, KA2PA(vesa_bpp)
    103 #endif 
    104 
    105         call map_kernel                                                 # map kernel and turn paging on
    106 
    107         # arch_pre_main(grub_eax, grub_ebx)
     84
     85#include "vesa_prot.inc"
     86
     87        # map kernel and turn paging on
     88        call map_kernel
     89       
     90        # call arch_pre_main(grub_eax, grub_ebx)
    10891        pushl grub_ebx
    10992        pushl grub_eax
     
    11295        call main_bsp
    11396       
    114         # Not reached.
    115        
     97        # not reached
    11698        cli
    117         hlt
     99        hlt0:
     100                hlt
     101                jmp hlt0
    118102
    119103.global map_kernel
     
    124108        #
    125109        movl %cr4, %ecx
    126         orl $(1 << 4), %ecx                                                     # turn PSE on
    127         andl $(~(1 << 5)), %ecx                                         # turn PAE off
     110        orl $(1 << 4), %ecx                 # turn PSE on
     111        andl $(~(1 << 5)), %ecx             # turn PAE off
    128112        movl %ecx, %cr4
    129113       
     
    132116        xorl %ecx, %ecx
    133117        xorl %ebx, %ebx
    134 0:
    135         movl $((1 << 7) | (1 << 1) | (1 << 0)), %eax
    136         orl %ebx, %eax
    137         movl %eax, (%esi, %ecx, 4)                                      # mapping 0x00000000 + %ecx * 4M => 0x00000000 + %ecx * 4M
    138         movl %eax, (%edi, %ecx, 4)                                      # mapping 0x80000000 + %ecx * 4M => 0x00000000 + %ecx * 4M
    139         addl $(4 * 1024 * 1024), %ebx
    140 
    141         incl %ecx
    142         cmpl $512, %ecx
    143         jl 0b
    144 
     118       
     119        floop:
     120                movl $((1 << 7) | (1 << 1) | (1 << 0)), %eax
     121                orl %ebx, %eax
     122                movl %eax, (%esi, %ecx, 4)      # mapping 0x00000000 + %ecx * 4M => 0x00000000 + %ecx * 4M
     123                movl %eax, (%edi, %ecx, 4)      # mapping 0x80000000 + %ecx * 4M => 0x00000000 + %ecx * 4M
     124                addl $(4 * 1024 * 1024), %ebx
     125               
     126                incl %ecx
     127                cmpl $512, %ecx
     128                jl floop
     129       
    145130        movl %esi, %cr3
    146131       
    147132        movl %cr0, %ebx
    148         orl $(1 << 31), %ebx                                            # turn paging on
     133        orl $(1 << 31), %ebx                # turn paging on
    149134        movl %ebx, %cr0
    150135        ret
     
    152137# Print string from %esi to EGA display (in red) and halt
    153138error_halt:
    154         movl $0xb8000, %edi                                             # base of EGA text mode memory
     139        movl $0xb8000, %edi         # base of EGA text mode memory
    155140        xorl %eax, %eax
    156141       
    157         movw $0x3d4, %dx                                                # read bits 8 - 15 of the cursor address
     142        movw $0x3d4, %dx            # read bits 8 - 15 of the cursor address
    158143        movb $0xe, %al
    159144        outb %al, %dx
     
    163148        shl $8, %ax
    164149       
    165         movw $0x3d4, %dx                                                # read bits 0 - 7 of the cursor address
     150        movw $0x3d4, %dx            # read bits 0 - 7 of the cursor address
    166151        movb $0xf, %al
    167152        outb %al, %dx
     
    172157        cmp $1920, %ax
    173158        jbe cursor_ok
    174                 movw $1920, %ax                                         # sanity check for the cursor on the last line
     159       
     160                movw $1920, %ax         # sanity check for the cursor on the last line
     161       
    175162        cursor_ok:
    176163       
     
    179166        addl %eax, %edi
    180167       
    181         movw $0x0c00, %ax                                               # black background, light red foreground
     168        movw $0x0c00, %ax           # black background, light red foreground
    182169       
    183170        ploop:
     
    186173                je ploop_end
    187174                stosw
    188                 inc %bx 
     175                inc %bx
    189176                jmp ploop
    190177        ploop_end:
    191178       
    192         movw $0x3d4, %dx                                                # write bits 8 - 15 of the cursor address
     179        movw $0x3d4, %dx            # write bits 8 - 15 of the cursor address
    193180        movb $0xe, %al
    194181        outb %al, %dx
     
    198185        outb %al, %dx
    199186       
    200         movw $0x3d4, %dx                                                # write bits 0 - 7 of the cursor address
     187        movw $0x3d4, %dx            # write bits 0 - 7 of the cursor address
    201188        movb $0xf, %al
    202189        outb %al, %dx
     
    205192        movb %bl, %al
    206193        outb %al, %dx
    207                
     194       
    208195        cli
    209         hlt
    210 
    211 #ifdef CONFIG_FB
    212 vesa_init:
    213         jmp $selector(VESA_INIT_DES), $vesa_init_real - vesa_init
    214        
    215 .code16
    216 vesa_init_real:
    217        
    218         mov %cr0, %eax
    219         and $~1, %eax
    220         mov %eax, %cr0
    221        
    222         jmp $VESA_INIT_SEGMENT, $vesa_init_real2 - vesa_init
    223        
    224 vesa_init_real2:
    225        
    226         mov $VESA_INIT_SEGMENT, %bx
    227        
    228         mov %bx, %es
    229         mov %bx, %fs
    230         mov %bx, %gs
    231         mov %bx, %ds
    232         mov %bx, %ss
    233        
    234         movl %esp, %eax
    235         movl $0x0000fffc, %esp
    236         movl $0x0000fffc, %ebp
    237         pushl %eax
    238        
    239 #define VESA_INFO_SIZE 1024
    240 
    241 #define VESA_MODE_ATTRIBUTES_OFFSET 0
    242 #define VESA_MODE_LIST_PTR_OFFSET 14
    243 #define VESA_MODE_SCANLINE_OFFSET 16
    244 #define VESA_MODE_WIDTH_OFFSET 18
    245 #define VESA_MODE_HEIGHT_OFFSET 20
    246 #define VESA_MODE_BPP_OFFSET 25
    247 #define VESA_MODE_PHADDR_OFFSET 40
    248 
    249 #define VESA_END_OF_MODES 0xffff
    250 
    251 #define VESA_OK 0x4f
    252 
    253 #define VESA_GET_INFO 0x4f00
    254 #define VESA_GET_MODE_INFO 0x4f01
    255 #define VESA_SET_MODE 0x4f02
    256 #define VESA_SET_PALETTE 0x4f09
    257 
    258 #if CONFIG_VESA_BPP == 24
    259 #define CONFIG_VESA_BPP_VARIANT 32
    260 #endif
    261 
    262         mov $VESA_GET_INFO, %ax
    263         mov $e_vesa_init - vesa_init, %di
    264         push %di
    265         int $0x10
    266        
    267         pop %di
    268         cmp $VESA_OK, %al
    269         jnz 0f
    270        
    271         mov 2 + VESA_MODE_LIST_PTR_OFFSET(%di), %si
    272         mov %si, %gs
    273         mov VESA_MODE_LIST_PTR_OFFSET(%di), %si
    274        
    275         add $VESA_INFO_SIZE, %di
    276 
    277 1:# Try next mode
    278         mov %gs:(%si), %cx
    279         cmp $VESA_END_OF_MODES, %cx
    280         jz 0f
    281        
    282         inc %si
    283         inc %si
    284         push %cx
    285         push %di
    286         push %si
    287         mov $VESA_GET_MODE_INFO, %ax
    288         int $0x10
    289        
    290         pop %si
    291         pop %di
    292         pop %cx
    293         cmp $VESA_OK, %al
    294         jnz 0f
    295        
    296         mov $CONFIG_VESA_WIDTH, %ax
    297         cmp VESA_MODE_WIDTH_OFFSET(%di), %ax
    298         jnz 1b
    299        
    300         mov $CONFIG_VESA_HEIGHT, %ax
    301         cmp VESA_MODE_HEIGHT_OFFSET(%di), %ax
    302         jnz 1b
    303        
    304         mov $CONFIG_VESA_BPP, %al
    305         cmp VESA_MODE_BPP_OFFSET(%di), %al
    306 
    307 #ifdef CONFIG_VESA_BPP_VARIANT
    308         jz 2f
    309        
    310         mov $CONFIG_VESA_BPP_VARIANT, %al
    311         cmp VESA_MODE_BPP_OFFSET(%di), %al
    312 #endif
    313         jnz 1b
    314 
    315 2:
    316        
    317         mov %cx, %bx
    318         or $0xc000, %bx
    319         push %di
    320         mov $VESA_SET_MODE, %ax
    321         int $0x10
    322        
    323         pop %di
    324         cmp $VESA_OK, %al
    325         jnz 0f
    326 
    327 #if CONFIG_VESA_BPP == 8
    328        
    329         # Set 3:2:3 VGA palette
    330        
    331         mov VESA_MODE_ATTRIBUTES_OFFSET(%di), %ax
    332         push %di
    333         mov $vga323 - vesa_init, %di
    334         mov $0x100, %ecx
    335        
    336         bt $5, %ax                                                      # Test if VGA compatible registers are present
    337         jnc vga_compat
    338                
    339                 # Try VESA routine to set palette
    340                
    341                 mov $VESA_SET_PALETTE, %ax
    342                 xor %bl, %bl
    343                 xor %dx, %dx
    344                 int $0x10
    345                
    346                 cmp $0x00, %ah
    347                 je vga_not_compat
    348        
    349         vga_compat:
    350                
    351                 # Try VGA registers to set palette
    352                
    353                 movw $0x3c6, %dx                                                # Set palette mask
    354                 movb $0xff, %al
    355                 outb %al, %dx
    356                
    357                 movw $0x3c8, %dx                                                # First index to set
    358                 xor %al, %al
    359                 outb %al, %dx
    360                
    361                 movw $0x3c9, %dx                                                # Data port
    362                 vga_loop:
    363                         movb %es:2(%di), %al
    364                         outb %al, %dx
    365                        
    366                         movb %es:1(%di), %al
    367                         outb %al, %dx
    368                        
    369                         movb %es:(%di), %al
    370                         outb %al, %dx
    371                        
    372                         addw $4, %di
    373                         loop vga_loop
    374                
    375         vga_not_compat:
    376        
    377         pop %di
    378        
    379 #endif
    380        
    381         mov VESA_MODE_PHADDR_OFFSET(%di), %esi
    382         mov VESA_MODE_WIDTH_OFFSET(%di), %ax
    383         shl $16, %eax
    384         mov VESA_MODE_HEIGHT_OFFSET(%di), %ax
    385         mov VESA_MODE_BPP_OFFSET(%di), %bl
    386         xor %bh, %bh
    387         shl $16, %ebx
    388         mov VESA_MODE_SCANLINE_OFFSET(%di), %bx
    389         mov %eax, %edi
    390        
    391 8:     
    392        
    393         mov %cr0, %eax
    394         or $1, %eax
    395         mov %eax, %cr0
    396        
    397         jmp 9f
    398 9:
    399        
    400         ljmpl $selector(KTEXT_DES), $(vesa_init_protect - vesa_init + VESA_INIT_SEGMENT << 4)
    401 
    402 0:# No prefered mode found
    403         mov $0x111, %cx
    404         push %di
    405         push %cx
    406         mov $VESA_GET_MODE_INFO, %ax
    407         int $0x10
    408        
    409         pop %cx
    410         pop %di
    411         cmp $VESA_OK, %al
    412         jnz 1f
    413         jz 2b                                           # Force relative jump
    414        
    415 1:
    416         mov $0x0003, %ax
    417         int $0x10
    418         mov $0xffffffff, %edi           # EGA text mode used, because of problems with VESA
    419         xor %ax, %ax
    420         jz 8b                                           # Force relative jump
    421 
    422 vga323:
    423 #include "vga323.pal"
    424 
    425 .code32
    426 vesa_init_protect:
    427         movw $selector(KDATA_DES), %cx
    428         movw %cx, %es
    429         movw %cx, %fs
    430         movw %cx, %gs
    431         movw %cx, %ds                                   # kernel data + stack
    432         movw %cx, %ss
    433        
    434         movl $START_STACK, %esp                 # initialize stack pointer
    435 
    436         jmpl $selector(KTEXT_DES), $vesa_meeting_point
    437 
    438 .align 4
    439 e_vesa_init:
    440 #endif 
     196        hlt1:
     197                hlt
     198                jmp hlt1
     199
     200#include "vesa_real.inc"
    441201
    442202.section K_DATA_START, "aw", @progbits
Note: See TracChangeset for help on using the changeset viewer.