Changeset 421c833 in mainline


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

Files:
6 added
6 edited

Legend:

Unmodified
Added
Removed
  • HelenOS.config

    r99d6fd0 r421c833  
    421421! [(CONFIG_HID_OUT=generic|CONFIG_HID_OUT=monitor)&PLATFORM=sparc64&MACHINE=generic] CONFIG_FB (y/n)
    422422
    423 % Framebuffer width
    424 @ "640"
    425 @ "800"
    426 @ "1024"
    427 @ "1152"
    428 @ "1280"
    429 @ "1400"
    430 @ "1440"
    431 @ "1600"
    432 @ "2048"
    433 ! [(PLATFORM=ia32|PLATFORM=amd64)&CONFIG_HID_OUT!=none&CONFIG_FB=y] CONFIG_VESA_WIDTH (choice)
    434 
    435 % Framebuffer height
    436 @ "480"
    437 @ "600"
    438 @ "768"
    439 @ "852"
    440 @ "900"
    441 @ "960"
    442 @ "1024"
    443 @ "1050"
    444 @ "1200"
    445 @ "1536"
    446 ! [(PLATFORM=ia32|PLATFORM=amd64)&CONFIG_HID_OUT!=none&CONFIG_FB=y] CONFIG_VESA_HEIGHT (choice)
    447 
    448 % Framebuffer depth
     423% Default framebuffer mode
     424@ "640x480"
     425@ "800x600"
     426@ "1024x768"
     427@ "1152x720"
     428@ "1152x864"
     429@ "1280x960"
     430@ "1280x1024"
     431@ "1400x1050"
     432@ "1440x900"
     433@ "1440x1050"
     434@ "1600x1200"
     435@ "1920x1080"
     436@ "1920x1200"
     437! [(PLATFORM=ia32|PLATFORM=amd64)&CONFIG_HID_OUT!=none&CONFIG_FB=y] CONFIG_VESA_MODE (choice)
     438
     439% Default framebuffer depth
    449440@ "8"
    450441@ "16"
  • defaults/amd64/Makefile.config

    r99d6fd0 r421c833  
    5050CONFIG_FB = y
    5151
    52 # Framebuffer width
    53 CONFIG_VESA_WIDTH = 800
     52# Default framebuffer mode
     53CONFIG_VESA_MODE = 800x600
    5454
    55 # Framebuffer height
    56 CONFIG_VESA_HEIGHT = 600
    57 
    58 # Framebuffer depth
     55# Default framebuffer depth
    5956CONFIG_VESA_BPP = 16
    6057
  • defaults/ia32/Makefile.config

    r99d6fd0 r421c833  
    5656CONFIG_FB = y
    5757
    58 # Framebuffer width
    59 CONFIG_VESA_WIDTH = 800
     58# Default framebuffer mode
     59CONFIG_VESA_MODE = 800x600
    6060
    61 # Framebuffer height
    62 CONFIG_VESA_HEIGHT = 600
    63 
    64 # Framebuffer depth
     61# Default framebuffer depth
    6562CONFIG_VESA_BPP = 16
    6663
  • kernel/arch/amd64/src/boot/boot.S

    r99d6fd0 r421c833  
    3838
    3939#define START_STACK     (BOOT_OFFSET - BOOT_STACK_SIZE)
    40        
     40
    4141.section K_TEXT_START, "ax"
    4242
     
    4747        .long MULTIBOOT_HEADER_MAGIC
    4848        .long MULTIBOOT_HEADER_FLAGS
    49         .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)        # checksum
     49        .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)  # checksum
    5050        .long multiboot_header
    5151        .long unmapped_ktext_start
     
    5656multiboot_image_start:
    5757        cld
    58         movl $START_STACK, %esp                 # initialize stack pointer
    59         lgdtl bootstrap_gdtr                    # initialize Global Descriptor Table register
    60 
     58        movl $START_STACK, %esp             # initialize stack pointer
     59        lgdtl bootstrap_gdtr                # initialize Global Descriptor Table register
     60       
    6161        movw $gdtselector(KDATA_DES), %cx
    6262        movw %cx, %es
    63         movw %cx, %ds                                                   # kernel data + stack
     63        movw %cx, %ds                       # kernel data + stack
    6464        movw %cx, %ss
     65       
     66        #
    6567        # Simics seems to remove hidden part of GS on entering user mode
    66         #  when _visible_ part of GS does not point to user-mode segment
     68        # when _visible_ part of GS does not point to user-mode segment.
     69        #
     70       
    6771        movw $gdtselector(UDATA_DES), %cx
    6872        movw %cx, %fs
     
    7276        multiboot_meeting_point:
    7377       
    74         movl %eax, grub_eax                                             # save parameters from GRUB
     78        movl %eax, grub_eax                 # save parameters from GRUB
    7579        movl %ebx, grub_ebx
    7680       
     81        #
    7782        # Protected 32-bit. We want to reuse the code-seg descriptor,
    78         # the Default operand size must not be 1 when entering long mode
    79        
    80         movl $(INTEL_CPUID_EXTENDED), %eax 
    81         cpuid
    82         cmp $(INTEL_CPUID_EXTENDED), %eax
     83        # the Default operand size must not be 1 when entering long mode.
     84        #
     85       
     86        movl $(INTEL_CPUID_EXTENDED), %eax
     87        cpuid
     88        cmp $(INTEL_CPUID_EXTENDED), %eax
    8389        ja extended_cpuid_supported
    84                
     90       
    8591                movl $extended_cpuid_msg, %esi
    8692                jmp error_halt
     
    9197        cpuid
    9298        bt $(AMD_EXT_LONG_MODE), %edx
    93         jc long_mode_supported
    94                
     99        jc long_mode_supported
     100       
    95101                movl $long_mode_msg, %esi
    96102                jmp error_halt
    97 
     103       
    98104        long_mode_supported:
    99105       
     
    109115        cpuid
    110116        bt $(INTEL_FXSAVE), %edx
    111         jc fx_supported
     117        jc fx_supported
    112118       
    113119                movl $fx_msg, %esi
     
    117123       
    118124        bt $(INTEL_SSE2), %edx
    119         jc sse2_supported
     125        jc sse2_supported
    120126       
    121127                movl $sse2_msg, %esi
     
    123129       
    124130        sse2_supported:
    125        
    126 #ifdef CONFIG_FB
    127         mov $vesa_init, %esi
    128         mov $VESA_INIT_SEGMENT << 4, %edi
    129         mov $e_vesa_init - vesa_init, %ecx
    130         rep movsb
    131 
    132         mov $VESA_INIT_SEGMENT << 4, %edi
    133         jmpl *%edi
    134        
    135         vesa_meeting_point:
    136        
    137         mov %esi, KA2PA(vesa_ph_addr)
    138         mov %di, KA2PA(vesa_height)
    139         shr $16, %edi
    140         mov %di, KA2PA(vesa_width)
    141         mov %bx, KA2PA(vesa_scanline)
    142         shr $16, %ebx
    143         mov %bx, KA2PA(vesa_bpp)
    144 #endif 
    145        
     131
     132#include "vesa_prot.inc"
     133
     134        #
    146135        # Enable 64-bit page translation entries - CR4.PAE = 1.
    147         # Paging is not enabled until after long mode is enabled
     136        # Paging is not enabled until after long mode is enabled.
     137        #
    148138       
    149139        movl %cr4, %eax
    150140        btsl $5, %eax
    151141        movl %eax, %cr4
    152 
    153         # Set up paging tables
     142       
     143        # set up paging tables
    154144       
    155145        leal ptl_0, %eax
    156146        movl %eax, %cr3
    157147       
    158         # Enable long mode
    159        
    160         movl $EFER_MSR_NUM, %ecx                        # EFER MSR number
    161         rdmsr                                           # Read EFER
    162         btsl $AMD_LME_FLAG, %eax                        # Set LME = 1
    163         wrmsr                                           # Write EFER
    164        
    165         # Enable paging to activate long mode (set CR0.PG = 1)
     148        # enable long mode
     149       
     150        movl $EFER_MSR_NUM, %ecx            # EFER MSR number
     151        rdmsr                               # read EFER
     152        btsl $AMD_LME_FLAG, %eax            # set LME = 1
     153        wrmsr                               # write EFER
     154       
     155        # enable paging to activate long mode (set CR0.PG = 1)
    166156       
    167157        movl %cr0, %eax
     
    169159        movl %eax, %cr0
    170160       
    171         # At this point we are in compatibility mode
     161        # at this point we are in compatibility mode
    172162       
    173163        jmpl $gdtselector(KTEXT_DES), $start64
     
    176166start64:
    177167        movq $(PA2KA(START_STACK)), %rsp
    178 
    179         # arch_pre_main(grub_eax, grub_ebx)
     168       
     169        # call arch_pre_main(grub_eax, grub_ebx)
    180170        xorq %rdi, %rdi
    181171        movl grub_eax, %edi
     
    183173        movl grub_ebx, %esi
    184174        call arch_pre_main
    185 
     175       
    186176        call main_bsp
    187 
    188         # Not reached.
     177       
     178        # not reached
    189179       
    190180        cli
    191         hlt
    192 
    193 #ifdef CONFIG_FB
    194 .code32
    195 vesa_init:
    196         jmp $gdtselector(VESA_INIT_DES), $vesa_init_real - vesa_init
    197        
    198 .code16
    199 vesa_init_real:
    200        
    201         mov %cr0, %eax
    202         and $~1, %eax
    203         mov %eax, %cr0
    204        
    205         jmp $VESA_INIT_SEGMENT, $vesa_init_real2 - vesa_init
    206        
    207 vesa_init_real2:
    208        
    209         mov $VESA_INIT_SEGMENT, %bx
    210        
    211         mov %bx, %es
    212         mov %bx, %fs
    213         mov %bx, %gs
    214         mov %bx, %ds
    215         mov %bx, %ss
    216        
    217         movl $0x0000fffc, %esp
    218         movl $0x0000fffc, %ebp
    219        
    220 #define VESA_INFO_SIZE 1024
    221 
    222 #define VESA_MODE_ATTRIBUTES_OFFSET 0
    223 #define VESA_MODE_LIST_PTR_OFFSET 14
    224 #define VESA_MODE_SCANLINE_OFFSET 16
    225 #define VESA_MODE_WIDTH_OFFSET 18
    226 #define VESA_MODE_HEIGHT_OFFSET 20
    227 #define VESA_MODE_BPP_OFFSET 25
    228 #define VESA_MODE_PHADDR_OFFSET 40
    229 
    230 #define VESA_END_OF_MODES 0xffff
    231 
    232 #define VESA_OK 0x4f
    233 
    234 #define VESA_GET_INFO 0x4f00
    235 #define VESA_GET_MODE_INFO 0x4f01
    236 #define VESA_SET_MODE 0x4f02
    237 #define VESA_SET_PALETTE 0x4f09
    238 
    239 #define CONFIG_VESA_BPP_a 255
    240 
    241 #if CONFIG_VESA_BPP == 24
    242 #define CONFIG_VESA_BPP_VARIANT 32
    243 #endif
    244 
    245         mov $VESA_GET_INFO, %ax
    246         mov $e_vesa_init - vesa_init, %di
    247         push %di
    248         int $0x10
    249        
    250         pop %di
    251         cmp $VESA_OK, %al
    252         jnz 0f
    253        
    254         mov 2 + VESA_MODE_LIST_PTR_OFFSET(%di), %si
    255         mov %si, %gs
    256         mov VESA_MODE_LIST_PTR_OFFSET(%di), %si
    257        
    258         add $VESA_INFO_SIZE, %di
    259 
    260 1:# Try next mode
    261         mov %gs:(%si), %cx
    262         cmp $VESA_END_OF_MODES, %cx
    263         jz 0f
    264        
    265         inc %si
    266         inc %si
    267         push %cx
    268         push %di
    269         push %si
    270         mov $VESA_GET_MODE_INFO, %ax
    271         int $0x10
    272        
    273         pop %si
    274         pop %di
    275         pop %cx
    276         cmp $VESA_OK, %al
    277         jnz 0f
    278        
    279         mov $CONFIG_VESA_WIDTH, %ax
    280         cmp VESA_MODE_WIDTH_OFFSET(%di), %ax
    281         jnz 1b
    282        
    283         mov $CONFIG_VESA_HEIGHT, %ax
    284         cmp VESA_MODE_HEIGHT_OFFSET(%di), %ax
    285         jnz 1b
    286        
    287         mov $CONFIG_VESA_BPP, %al
    288         cmp VESA_MODE_BPP_OFFSET(%di), %al
    289 
    290 #ifdef CONFIG_VESA_BPP_VARIANT
    291         jz 2f
    292        
    293         mov $CONFIG_VESA_BPP_VARIANT, %al
    294         cmp VESA_MODE_BPP_OFFSET(%di), %al
    295 #endif
    296         jnz 1b
    297        
    298 2:
    299        
    300         mov %cx, %bx
    301         or $0xc000, %bx
    302         push %di
    303         mov $VESA_SET_MODE, %ax
    304         int $0x10
    305        
    306         pop %di
    307         cmp $VESA_OK, %al
    308         jnz 0f
    309 
    310 #if CONFIG_VESA_BPP == 8
    311        
    312         # Set 3:2:3 VGA palette
    313        
    314         mov VESA_MODE_ATTRIBUTES_OFFSET(%di), %ax
    315         push %di
    316         mov $vga323 - vesa_init, %di
    317         mov $0x100, %ecx
    318        
    319         bt $5, %ax                                              # Test if VGA compatible registers are present
    320         jnc vga_compat
    321                
    322                 # Try VESA routine to set palette
    323                
    324                 mov $VESA_SET_PALETTE, %ax
    325                 xor %bl, %bl
    326                 xor %dx, %dx
    327                 int $0x10
    328                
    329                 cmp $0x00, %ah
    330                 je vga_not_compat
    331        
    332         vga_compat:
    333                
    334                 # Try VGA registers to set palette
    335                
    336                 movw $0x3c6, %dx                                # Set palette mask
    337                 movb $0xff, %al
    338                 outb %al, %dx
    339                
    340                 movw $0x3c8, %dx                                # First index to set
    341                 xor %al, %al
    342                 outb %al, %dx
    343                
    344                 movw $0x3c9, %dx                                # Data port
    345                 vga_loop:
    346                         movb %es:2(%di), %al
    347                         outb %al, %dx
    348                        
    349                         movb %es:1(%di), %al
    350                         outb %al, %dx
    351                        
    352                         movb %es:(%di), %al
    353                         outb %al, %dx
    354                        
    355                         addw $4, %di
    356                         loop vga_loop
    357                
    358         vga_not_compat:
    359        
    360         pop %di
    361        
    362 #endif
    363        
    364         mov VESA_MODE_PHADDR_OFFSET(%di), %esi
    365         mov VESA_MODE_WIDTH_OFFSET(%di), %ax
    366         shl $16, %eax
    367         mov VESA_MODE_HEIGHT_OFFSET(%di), %ax
    368         mov VESA_MODE_BPP_OFFSET(%di), %bl
    369         xor %bh, %bh
    370         shl $16, %ebx
    371         mov VESA_MODE_SCANLINE_OFFSET(%di), %bx
    372         mov %eax, %edi
    373        
    374 8:
    375        
    376         mov %cr0, %eax
    377         or $1, %eax
    378         mov %eax, %cr0
    379        
    380         jmp 9f
    381 9:
    382        
    383         ljmpl $gdtselector(KTEXT32_DES), $(vesa_init_protect - vesa_init + VESA_INIT_SEGMENT << 4)
    384        
    385 0:# No prefered mode found
    386         mov $0x111, %cx
    387         push %di
    388         push %cx
    389         mov $VESA_GET_MODE_INFO, %ax
    390         int $0x10
    391        
    392         pop %cx
    393         pop %di
    394         cmp $VESA_OK, %al
    395         jnz 1f
    396         jz 2b                                           # Force relative jump
    397 
    398 1:
    399         mov $0x0003, %ax
    400         int $0x10
    401         mov $0xffffffff, %edi                           # EGA text mode used, because of problems with VESA
    402         xor %ax, %ax
    403         jz 8b                                           # Force relative jump
    404 
    405 vga323:
    406 #include "vga323.pal"   
    407        
    408 .code32
    409 vesa_init_protect:
    410         movw $gdtselector(KDATA_DES), %cx
    411         movw %cx, %es
    412         movw %cx, %ds                                   # kernel data + stack
    413         movw %cx, %ss
    414         # Simics seems to remove hidden part of GS on entering user mode
    415         #  when _visible_ part of GS does not point to user-mode segment
    416         movw $gdtselector(UDATA_DES), %cx
    417         movw %cx, %fs
    418         movw %cx, %gs
    419        
    420         movl $START_STACK, %esp                         # initialize stack pointer
    421        
    422         jmpl $gdtselector(KTEXT32_DES), $vesa_meeting_point
    423        
    424 .align 4
    425 e_vesa_init:
    426 #endif
     181        hlt0:
     182                hlt
     183                jmp hlt0
    427184
    428185# Print string from %esi to EGA display (in red) and halt
    429186error_halt:
    430         movl $0xb8000, %edi                             # base of EGA text mode memory
     187        movl $0xb8000, %edi       # base of EGA text mode memory
    431188        xorl %eax, %eax
    432189       
    433         movw $0x3d4, %dx                                # read bits 8 - 15 of the cursor address
     190        movw $0x3d4, %dx          # read bits 8 - 15 of the cursor address
    434191        movb $0xe, %al
    435192        outb %al, %dx
     
    439196        shl $8, %ax
    440197       
    441         movw $0x3d4, %dx                                # read bits 0 - 7 of the cursor address
     198        movw $0x3d4, %dx          # read bits 0 - 7 of the cursor address
    442199        movb $0xf, %al
    443200        outb %al, %dx
     
    448205        cmp $1920, %ax
    449206        jbe cursor_ok
    450                 movw $1920, %ax                         # sanity check for the cursor on the last line
     207       
     208                movw $1920, %ax       # sanity check for the cursor on the last line
     209       
    451210        cursor_ok:
    452211       
     
    455214        addl %eax, %edi
    456215       
    457         movw $0x0c00, %ax                               # black background, light red foreground
     216        movw $0x0c00, %ax         # black background, light red foreground
    458217       
    459218        ploop:
     
    462221                je ploop_end
    463222                stosw
    464                 inc %bx 
     223                inc %bx
    465224                jmp ploop
    466225        ploop_end:
    467226       
    468         movw $0x3d4, %dx                                # write bits 8 - 15 of the cursor address
     227        movw $0x3d4, %dx          # write bits 8 - 15 of the cursor address
    469228        movb $0xe, %al
    470229        outb %al, %dx
     
    474233        outb %al, %dx
    475234       
    476         movw $0x3d4, %dx                                # write bits 0 - 7 of the cursor address
     235        movw $0x3d4, %dx          # write bits 0 - 7 of the cursor address
    477236        movb $0xf, %al
    478237        outb %al, %dx
     
    481240        movb %bl, %al
    482241        outb %al, %dx
    483                
     242       
    484243        cli
    485         hlt
    486                                
     244        hlt1:
     245                hlt
     246                jmp hlt1
     247
     248#include "vesa_real.inc"
    487249
    488250.section K_INI_PTLS, "aw", @progbits
     
    490252#
    491253# Macro for generating initial page table contents.
    492 # @param cnt    Number of entries to generat. Must be multiple of 8.
    493 # @param g      Number of GB that will be added to the mapping.
     254# @param cnt Number of entries to generat. Must be multiple of 8.
     255# @param g   Number of GB that will be added to the mapping.
    494256#
    495257.macro ptl2gen cnt g
     
    543305        .quad ptl_2_0g + (PTL_WRITABLE | PTL_PRESENT)
    544306        .fill 1, 8, 0
    545        
     307
    546308.align 4096
    547309.global ptl_0
  • kernel/arch/amd64/src/boot/memmap.c

    r99d6fd0 r421c833  
    2727 */
    2828
    29 /** @addtogroup amd64mm 
     29/** @addtogroup amd64mm
    3030 * @{
    3131 */
  • 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.