CeDOS - Commit e4b341e4

Real mode switch without any interrupt call yet
Celina Kalus
Mon, 27 Mar 2023 17:46:48 +0200
3 files changed, 92 insertions(+), 23 deletions(-)
M include/linker.hinclude/linker.h

@@ -6,36 +6,20 @@ #define LINKER_H

#include <stdint.h> -extern uint8_t __SS_VMA; -extern uint8_t __SS_LMA; -extern uint8_t __SS_SIZE; - extern uint8_t __KERNEL_VMA; extern uint8_t __KERNEL_LMA; extern uint8_t __KERNEL_SIZE; -extern uint8_t __APP_VMA; -extern uint8_t __APP_LMA; -extern uint8_t __APP_SIZE; - -extern uint8_t __ELF_VMA; -extern uint8_t __ELF_LMA; -extern uint8_t __ELF_SIZE; - -#define SS_VMA (&__SS_VMA) -#define SS_LMA (&__SS_LMA) -#define SS_SIZE (uint32_t)(&__SS_SIZE) - #define KERNEL_VMA (&__KERNEL_VMA) #define KERNEL_LMA (&__KERNEL_LMA) #define KERNEL_SIZE (uint32_t)(&__KERNEL_SIZE) -#define APP_VMA (&__APP_VMA) -#define APP_LMA (&__APP_LMA) -#define APP_SIZE (uint32_t)(&__APP_SIZE) +extern uint8_t __REALMD_VMA; +extern uint8_t __REALMD_LMA; +extern uint8_t __REALMD_SIZE; -#define ELF_VMA (&__ELF_VMA) -#define ELF_LMA (&__ELF_LMA) -#define ELF_SIZE (uint32_t)(&__ELF_SIZE) +#define REALMD_VMA (&__REALMD_VMA) +#define REALMD_LMA (&__REALMD_LMA) +#define REALMD_SIZE (uint32_t)(&__REALMD_SIZE) #endif
A src/kernel/graphics.s

@@ -0,0 +1,74 @@

+.section .text_realmode +realmode_int10h: + push %ebp + mov %esp, %ebp + + pusha + + push %ds + push %es + push %fs + push %ss + + mov %esp, %eax + mov %eax, %esi + + mov %ebp, %eax + mov %eax, %edi + + # setup real mode stack + mov $0xF000, %eax + mov %eax, %esp + mov %eax, %ebp + + push %esi + push %edi + + # switch to realmode temporarily + mov %cr0, %eax + and $0xFFFFFFFE, %eax + mov %eax, %cr0 + + # perform long jump to set code segment + ljmp $0, $realmode +return_pmode: + # set data segments + movw $0x10, %ax + movw %ax, %ss + movw %ax, %ds + movw %ax, %es + movw %ax, %fs + + # restore stack + pop %ebp + pop %eax + mov %eax, %esp + + # restore original segments and registers + pop %ss + pop %fs + pop %es + pop %ds + + popa + + # return + pop %ebp + + +.code16 +realmode: + # setup real mode segments + movw $0x0000, %ax + movw %ax, %ss + movw %ax, %ds + movw %ax, %es + movw %ax, %fs + + # perform the actual interrupt + + mov %cr0, %eax + and $0x00000001, %eax + mov %eax, %cr0 + + ljmp $0x8, $return_pmode
M src/kernel/link.txtsrc/kernel/link.txt

@@ -5,22 +5,33 @@ PAGE_SIZE = 1 << 12;

MEMORY { + REALMD_VMA : ORIGIN = 0x00009000, LENGTH = 0x30000000 KERNEL_VMA : ORIGIN = 0xC0000000, LENGTH = 0x30000000 } SECTIONS { - KERNEL : AT(0x4E00) + KERNEL : { */*(.text) */*(.data) */*(.rodata*) } >KERNEL_VMA + + REALMD : + { + */*(.text_realmode) + + } >REALMD_VMA } __KERNEL_LMA = LOADADDR(KERNEL); __KERNEL_VMA = ADDR(KERNEL); __KERNEL_SIZE = SIZEOF(KERNEL); + +__REALMD_LMA = LOADADDR(REALMD); +__REALMD_VMA = ADDR(REALMD); +__REALMD_SIZE = SIZEOF(REALMD); __KERNEL_STACK_ADDR = 0xC0400000;