// SwitchMode.h
#ifndef __MODE_SWITCH__
#define __MODE_SWITCH__
#include "Types.h"
void kCpuid(DWORD* eax, DWORD* ebx, DWORD* ecx, DWORD* edx);
void kSwitchModeTo64(void);
extern void kPrintString(int nX, int nY, const char* pString);
extern int gScreenY;
#endif
// SwitchMode.c
#include "ModeSwitch.h"
void kCpuid(DWORD* eax, DWORD* ebx, DWORD* ecx, DWORD* edx)
{
__asm__ __volatile__ ("cpuid"
:"=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx)
:"a"(*eax) );
}
void setCR4(void)
{
int eax;
eax = 0x20;
__asm__ __volatile( "or $0x20, %%eax\n"
"mov %%eax, %%cr4"
:
:"a"(eax));
}
void setCR3(DWORD eax)
{
__asm__ __volatile("mov %%eax, %%cr3"
:
:"a"(eax));
}
void setIA32_EFER(void)
{
DWORD ecx;
ecx = 0xC0000080;
__asm__ __volatile( "rdmsr\n"
"or $0x0100, %%eax\n"
"wrmsr"
:
:"c"(ecx));
}
void setCR0(void)
{
BYTE cs;
cs = 0x08;
char* string = "GCC Inline Assembly Operation................[PASS]";
__asm__ __volatile( "mov %%cr0, %%eax\n"
"or $0xE0000000, %%eax\n"
"xor $0x60000000, %%eax\n"
"mov %%eax, %%cr0\n"
"mov $0x20000, %%eax\n"
//
"push %%esi\n"
"push %%edx\n"
"push %%ecx\n"
"call *%%edi\n"
//
"ljmp $0x08, $0x200000\n"
:
:"c"(0x00), "d"(gScreenY++), "S"(string), "D"(kPrintString) );
}
void kSwitchModeTo64(void)
{
setCR4();
setCR3(0x100000);
setIA32_EFER();
setCR0();
}
# ImageMaker.py
import sys
import struct
def createDiskImage():
fDiskImage = open('Disk.img', "wb+")
return fDiskImage
def readBootLoader(fDiskImage):
fBootLoader = open('00.BootLoader/BootLoader.bin', 'rb')
# get size of bootloader
fBootLoader.seek(0, 2)
sizeOfBootLoader = fBootLoader.tell()
# reset file descriptor
fBootLoader.seek(0)
fDiskImage.write(fBootLoader.read())
# padding = struct.pack('b', 0) * (sizeOfBootLoader % 512)
if ( sizeOfBootLoader % 512 ) != 0 :
padding = (b'\x00') * (sizeOfBootLoader % 512)
fDiskImage.write(padding)
fBootLoader.close()
def readKernel(fDiskImage, Path):
fKernel = open(Path, 'rb')
fKernel.seek(0, 2)
sizeOfKernel = fKernel.tell()
fKernel.seek(0)
fDiskImage.write(fKernel.read())
if ( sizeOfKernel % 512 ) != 0 :
for i in range(512 - (sizeOfKernel % 512)):
fDiskImage.write(b'\x00')
sizeOfKernel += (512 - (sizeOfKernel % 512))
fKernel.close()
return (sizeOfKernel // 512)
if __name__ == "__main__":
fDiskImage = createDiskImage()
readBootLoader(fDiskImage)
k32sectorNumber = readKernel(fDiskImage, '01.Kernel32/Kernel32.bin')
k64sectorNumber = readKernel(fDiskImage, '02.Kernel64/Kernel64.bin')
print ("Sector Number :", k32sectorNumber)
print ("Sector Number :", k64sectorNumber)
fDiskImage.seek(5);
fDiskImage.write(struct.pack('b', k32sectorNumber + k64sectorNumber))
fDiskImage.seek(7);
fDiskImage.write(struct.pack('b', k32sectorNumber))
fDiskImage.close()