37 lines
950 B
ArmAsm
37 lines
950 B
ArmAsm
/* https://github.com/cirosantilli/x86-bare-metal-examples# */
|
|
|
|
#include "common.h"
|
|
|
|
BEGIN
|
|
CLEAR
|
|
STAGE2
|
|
PROTECTED_MODE
|
|
SETUP_PAGING_4M
|
|
|
|
/* Setup a test canary value. */
|
|
movl $0x1234, 0x1000
|
|
|
|
/* Print the canary to make sure it is really there. */
|
|
VGA_PRINT_HEX_4 0x1000
|
|
|
|
/* Make page 0 point to 4KiB. */
|
|
orb $0x10, page_table + 1
|
|
|
|
PAGING_ON
|
|
|
|
/* THIS is what we've been working for!!!
|
|
* Even though we mov to 0, the paging circuit reads that as physical address 0x1000,
|
|
* so the canary value 0x1234 should be modified to 0x5678.
|
|
**/
|
|
movl $0x5678, 0
|
|
|
|
/* Turn paging back off to prevent it from messing with us.
|
|
* Remember that VGA does memory accesses, so if paging is still on,
|
|
* we must identity map up to it, which we have, so this is not mandatory.
|
|
* */
|
|
PAGING_OFF
|
|
|
|
/* Print the (hopefully) modified value 0x5678. */
|
|
VGA_PRINT_HEX_4 0x1000
|
|
jmp .
|