123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- #include "common.h"
- BEGIN
- CLEAR
- STAGE2
- PROTECTED_MODE
- /* Sanity check 1: just print the output. */
- VGA_PRINT_STRING $output
- /* Sanity check 2: make a mov without any segment manipulation. */
- mov message, %cl
- mov %cl, output
- VGA_PRINT_STRING $output
- /* Now for the real action. */
- mov $gdt_data, %edx
- /* We are touching the 7th byte of the data entry. */
- add $3, %edx
- mov (%edx), %al
- /* Cache it for later. */
- mov %al, %bl
- /* Set the first bit of the descriptor memory. */
- xor $1, %al
- mov %al, (%edx)
- /* We must re-set ds because the segment descriptor is cached
- * and this updates it:
- * http://wiki.osdev.org/Descriptor_Cache
- */
- mov $DATA_SEG, %ax
- mov %ax, %ds
- /* This is the only memory access we will make with
- * the modified segment, to minimize the effect on our IO.
- */
- mov message, %cl
- /* Restore the old segment. */
- /* TODO is this needed to take into account the new segmentation? */
- dec %edx
- mov %bl, (%edx)
- mov %ax, %ds
- /* TODO this sanity check is not printing "ab".
- * It fails, so we're not restoring the old state properly.
- * Maybe blows up because video memory going wrong?
- */
- VGA_PRINT_STRING $message
- mov %cl, output
- VGA_PRINT_STRING $output
- hlt
- message:
- .asciz "ab"
- output:
- .asciz "x"
|