Changeset f1380b7 in mainline for kernel/arch/ia32/src/boot/vesa_real.inc
- Timestamp:
- 2018-03-02T20:21:57Z (6 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 34e1206
- Parents:
- a35b458
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:51:04)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:21:57)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/src/boot/vesa_real.inc
ra35b458 rf1380b7 31 31 vesa_init: 32 32 lidtl vesa_idtr 33 33 34 34 mov $GDT_SELECTOR(VESA_INIT_DATA_DES), %bx 35 35 36 36 mov %bx, %es 37 37 mov %bx, %fs … … 39 39 mov %bx, %ds 40 40 mov %bx, %ss 41 41 42 42 jmp $GDT_SELECTOR(VESA_INIT_CODE_DES), $vesa_init_real - vesa_init 43 43 … … 51 51 and $~CR0_PE, %eax 52 52 mov %eax, %cr0 53 53 54 54 jmp $VESA_INIT_SEGMENT, $vesa_init_real2 - vesa_init 55 55 56 56 vesa_init_real2: 57 57 mov $VESA_INIT_SEGMENT, %bx 58 58 59 59 mov %bx, %es 60 60 mov %bx, %fs … … 62 62 mov %bx, %ds 63 63 mov %bx, %ss 64 64 65 65 movl %esp, %eax 66 66 movl $0x0000fffc, %esp 67 67 movl $0x0000fffc, %ebp 68 68 pushl %eax 69 69 70 70 /* Parse default mode string */ 71 71 72 72 mov $default_mode - vesa_init, %di 73 73 xor %eax, %eax 74 74 xor %ebx, %ebx 75 75 76 76 mov $8, %ecx 77 77 parse_width: 78 78 mov (%di), %al 79 79 80 80 /* Check for digit */ 81 81 82 82 cmp $'0', %al 83 83 jb parse_width_done 84 84 85 85 cmp $'9', %al 86 86 ja parse_width_done 87 87 88 88 sub $'0', %al 89 89 90 90 /* Multiply default_width by 10 and add digit */ 91 91 92 92 mov default_width - vesa_init, %bx 93 93 lea (%ebx, %ebx, 4), %ebx … … 95 95 add %ax, %bx 96 96 mov %bx, default_width - vesa_init 97 97 98 98 inc %di 99 99 loop parse_width 100 100 parse_width_done: 101 101 102 102 mov (%di), %al 103 103 cmp $0, %al 104 104 jz parse_done 105 105 inc %di 106 106 107 107 mov $8, %ecx 108 108 parse_height: 109 109 mov (%di), %al 110 110 111 111 /* Check for digit */ 112 112 113 113 cmp $'0', %al 114 114 jb parse_height_done 115 115 116 116 cmp $'9', %al 117 117 ja parse_height_done 118 118 119 119 sub $'0', %al 120 120 121 121 /* Multiply default_height by 10 and add digit */ 122 122 123 123 mov default_height - vesa_init, %bx 124 124 lea (%ebx, %ebx, 4), %ebx … … 126 126 add %ax, %bx 127 127 mov %bx, default_height - vesa_init 128 128 129 129 inc %di 130 130 loop parse_height 131 131 parse_height_done: 132 132 133 133 mov (%di), %al 134 134 cmp $0, %al 135 135 jz parse_done 136 136 inc %di 137 137 138 138 mov $4, %ecx 139 139 parse_bpp: 140 140 mov (%di), %al 141 141 142 142 /* Check for digit */ 143 143 144 144 cmp $'0', %al 145 145 jb parse_bpp_done 146 146 147 147 cmp $'9', %al 148 148 ja parse_bpp_done 149 149 150 150 sub $'0', %al 151 151 152 152 /* Multiply default_bpp by 10 and add digit */ 153 153 154 154 mov default_bpp - vesa_init, %bx 155 155 lea (%ebx, %ebx, 4), %ebx … … 157 157 add %ax, %bx 158 158 mov %bx, default_bpp - vesa_init 159 159 160 160 inc %di 161 161 loop parse_bpp 162 162 parse_bpp_done: 163 163 164 164 parse_done: 165 165 166 166 mov $VESA_GET_INFO, %ax 167 167 mov $e_vesa_init - vesa_init, %di … … 178 178 movl $0x32454256, (%di) 179 179 int $0x10 180 180 181 181 pop %di 182 182 cmp $VESA_OK, %al 183 183 jnz no_mode 184 184 185 185 mov 2 + VESA_MODE_LIST_PTR_OFFSET(%di), %si 186 186 mov %si, %gs 187 187 mov VESA_MODE_LIST_PTR_OFFSET(%di), %si 188 188 189 189 add $VESA_INFO_SIZE, %di 190 190 191 191 next_mode: 192 192 /* Try next mode */ 193 193 194 194 mov %gs:(%si), %cx 195 195 cmp $VESA_END_OF_MODES, %cx 196 196 je no_mode 197 197 198 198 inc %si 199 199 inc %si … … 203 203 mov $VESA_GET_MODE_INFO, %ax 204 204 int $0x10 205 205 206 206 pop %si 207 207 pop %di … … 209 209 cmp $VESA_OK, %al 210 210 jne no_mode 211 211 212 212 /* 213 213 * Check for proper attributes (supported, 214 214 * color, graphics, linear framebuffer). 215 215 */ 216 216 217 217 mov VESA_MODE_ATTRIBUTES_OFFSET(%di), %ax 218 218 and $0x99, %ax 219 219 cmp $0x99, %ax 220 220 jne next_mode 221 221 222 222 /* Check for proper resolution */ 223 223 224 224 mov default_width - vesa_init, %ax 225 225 cmp VESA_MODE_WIDTH_OFFSET(%di), %ax 226 226 jne next_mode 227 227 228 228 mov default_height - vesa_init, %ax 229 229 cmp VESA_MODE_HEIGHT_OFFSET(%di), %ax 230 230 jne next_mode 231 231 232 232 /* Check for proper bpp */ 233 233 234 234 mov default_bpp - vesa_init, %al 235 235 cmp VESA_MODE_BPP_OFFSET(%di), %al 236 236 je set_mode 237 237 238 238 mov $24, %al 239 239 cmp default_bpp - vesa_init, %al 240 240 jne next_mode 241 241 242 242 /* For 24 bpp modes accept also 32 bit bpp */ 243 243 244 244 mov $32, %al 245 245 cmp VESA_MODE_BPP_OFFSET(%di), %al 246 246 jne next_mode 247 247 248 248 set_mode: 249 249 mov %cx, %bx … … 252 252 mov $VESA_SET_MODE, %ax 253 253 int $0x10 254 254 255 255 pop %di 256 256 cmp $VESA_OK, %al 257 257 jnz no_mode 258 258 259 259 /* Set 3:2:3 VGA palette */ 260 260 261 261 mov VESA_MODE_BPP_OFFSET(%di), %al 262 262 cmp $8, %al 263 263 jnz vga_not_set 264 264 265 265 mov VESA_MODE_ATTRIBUTES_OFFSET(%di), %ax 266 266 push %di 267 267 mov $vga323 - vesa_init, %di 268 268 mov $0x100, %ecx 269 269 270 270 /* Test if VGA compatible registers are present */ 271 271 bt $5, %ax 272 272 jnc vga_compat 273 273 274 274 /* Use VESA routine to set the palette */ 275 275 276 276 mov $VESA_SET_PALETTE, %ax 277 277 xor %bl, %bl 278 278 xor %dx, %dx 279 279 int $0x10 280 280 281 281 cmp $0x00, %ah 282 282 je vga_not_compat 283 283 284 284 vga_compat: 285 285 286 286 /* Use VGA registers to set the palette */ 287 287 288 288 movw $0x3c6, %dx /* set palette mask */ 289 289 movb $0xff, %al 290 290 outb %al, %dx 291 291 292 292 movw $0x3c8, %dx /* first index to set */ 293 293 xor %al, %al 294 294 outb %al, %dx 295 295 296 296 movw $0x3c9, %dx /* data port */ 297 297 298 298 vga_loop: 299 299 movb %es:2(%di), %al 300 300 outb %al, %dx 301 301 302 302 movb %es:1(%di), %al 303 303 outb %al, %dx 304 304 305 305 movb %es:(%di), %al 306 306 outb %al, %dx 307 307 308 308 addw $4, %di 309 309 loop vga_loop 310 310 311 311 vga_not_compat: 312 312 313 313 pop %di 314 314 315 315 vga_not_set: 316 316 317 317 /* 318 318 * Store mode parameters: … … 323 323 * edi = linear frame buffer 324 324 */ 325 325 326 326 mov VESA_MODE_BPP_OFFSET(%di), %al 327 327 xor %ah, %ah 328 328 shl $16, %eax 329 329 mov VESA_MODE_SCANLINE_OFFSET(%di), %ax 330 330 331 331 mov VESA_MODE_WIDTH_OFFSET(%di), %bx 332 332 shl $16, %ebx 333 333 mov VESA_MODE_HEIGHT_OFFSET(%di), %bx 334 334 335 335 mov VESA_MODE_BLUE_MASK_OFFSET(%di), %dl 336 336 shl $8, %edx 337 337 mov VESA_MODE_BLUE_POS_OFFSET(%di), %dl 338 338 mov %edx, %esi 339 339 340 340 mov VESA_MODE_RED_MASK_OFFSET(%di), %dl 341 341 shl $8, %edx 342 342 mov VESA_MODE_RED_POS_OFFSET(%di), %dl 343 343 344 344 shl $8, %edx 345 345 mov VESA_MODE_GREEN_MASK_OFFSET(%di), %dl 346 346 shl $8, %edx 347 347 mov VESA_MODE_GREEN_POS_OFFSET(%di), %dl 348 348 349 349 mov VESA_MODE_PHADDR_OFFSET(%di), %edi 350 350 351 351 vesa_leave_real: 352 352 353 353 mov %cr0, %ecx 354 354 or $CR0_PE, %ecx 355 355 mov %ecx, %cr0 356 356 357 357 jmp vesa_leave_real2 358 358 359 359 vesa_leave_real2: 360 360 361 361 ljmpl $GDT_SELECTOR(KTEXT32_DES), $(vesa_init_protected - vesa_init + VESA_INIT_SEGMENT << 4) 362 362 363 363 no_mode: 364 364 365 365 /* No prefered mode found */ 366 366 367 367 mov $0x111, %cx 368 368 push %di … … 370 370 mov $VESA_GET_MODE_INFO, %ax 371 371 int $0x10 372 372 373 373 pop %cx 374 374 pop %di … … 376 376 jnz text_mode 377 377 jz set_mode /* force relative jump */ 378 378 379 379 text_mode: 380 380 381 381 /* Reset to EGA text mode (because of problems with VESA) */ 382 382 383 383 mov $0x0003, %ax 384 384 int $0x10 385 385 386 386 xor %eax, %eax 387 387 xor %ebx, %ebx 388 388 xor %edx, %edx 389 389 xor %edi, %edi 390 390 391 391 jz vesa_leave_real /* force relative jump */ 392 392
Note:
See TracChangeset
for help on using the changeset viewer.