forked from xt-sys/exectos
Compare commits
5 Commits
cpuid-enha
...
master
Author | SHA1 | Date | |
---|---|---|---|
6a8a561484
|
|||
c5f522be4c
|
|||
ce8041754b
|
|||
c4af89946b
|
|||
95fecfc095
|
@@ -60,12 +60,10 @@ file(RELATIVE_PATH _PATH_PREFIX ${EXECTOS_BINARY_DIR} ${EXECTOS_SOURCE_DIR})
|
|||||||
add_compiler_flags(-D__RELFILE__="&__FILE__[__FILE__[0] == '.' ? sizeof \\\"${_PATH_PREFIX}\\\" - 1 : sizeof XTOS_SOURCE_DIR]")
|
add_compiler_flags(-D__RELFILE__="&__FILE__[__FILE__[0] == '.' ? sizeof \\\"${_PATH_PREFIX}\\\" - 1 : sizeof XTOS_SOURCE_DIR]")
|
||||||
|
|
||||||
# Set the virtual disk image size (in MiB)
|
# Set the virtual disk image size (in MiB)
|
||||||
set_disk_image_size(32)
|
set_disk_image_size(48)
|
||||||
|
|
||||||
# Build all subprojects
|
# Build all subprojects
|
||||||
add_subdirectory(boot)
|
add_subdirectory(boot)
|
||||||
add_subdirectory(bootdata)
|
|
||||||
add_subdirectory(drivers)
|
add_subdirectory(drivers)
|
||||||
add_subdirectory(sdk)
|
add_subdirectory(sdk)
|
||||||
add_subdirectory(xtldr)
|
|
||||||
add_subdirectory(xtoskrnl)
|
add_subdirectory(xtoskrnl)
|
||||||
|
22
README.md
22
README.md
@@ -57,16 +57,18 @@ ExectOS is in very early development stage, thus its requirements have been not
|
|||||||
design, it requires a modern EFI enabled hardware. It is not possible currently to boot ExectOS on a legacy BIOS.
|
design, it requires a modern EFI enabled hardware. It is not possible currently to boot ExectOS on a legacy BIOS.
|
||||||
|
|
||||||
# Source structure
|
# Source structure
|
||||||
| Directory | Description |
|
| Directory | Description |
|
||||||
|-------------|----------------------------------------------------------|
|
|------------------|--------------------------------------------------------------|
|
||||||
| bootdata | default configuration and data needed to boot XTOS |
|
| boot/bootdata | default configuration and data needed to boot XTOS |
|
||||||
| drivers | XT native drivers source code |
|
| boot/bootsect | boot sector code (MBR & VBR) initializing the boot process |
|
||||||
| sdk/cmake | Host toolchain configuration and build-related functions |
|
| boot/xtldr | XTOS boot loader source code |
|
||||||
| sdk/xtdk | XT Software Development Kit headers |
|
| drivers | XT native drivers source code |
|
||||||
| services | integral subsystems services source code |
|
| sdk/cmake | host toolchain configuration and build-related functions |
|
||||||
| subsystems | environment subsystems source code |
|
| sdk/firmware | firmware enabling XTOS to boot on virtual machines |
|
||||||
| xtoskrnl | XTOS kernel source code |
|
| sdk/xtdk | XT Software Development Kit headers |
|
||||||
| xtldr | XTOS boot loader source code |
|
| services | integral subsystems services source code |
|
||||||
|
| subsystems | environment subsystems source code |
|
||||||
|
| xtoskrnl | XTOS kernel source code |
|
||||||
|
|
||||||
# Build
|
# Build
|
||||||
XTOS can only be built using [XTchain](https://git.codingworkshop.eu.org/xt-sys/xtchain), a dedicated toolchain designed
|
XTOS can only be built using [XTchain](https://git.codingworkshop.eu.org/xt-sys/xtchain), a dedicated toolchain designed
|
||||||
|
@@ -1 +1,3 @@
|
|||||||
|
add_subdirectory(bootdata)
|
||||||
add_subdirectory(bootsect)
|
add_subdirectory(bootsect)
|
||||||
|
add_subdirectory(xtldr)
|
||||||
|
@@ -84,14 +84,145 @@ RealStart:
|
|||||||
leaw -16(%bp), %sp
|
leaw -16(%bp), %sp
|
||||||
sti
|
sti
|
||||||
|
|
||||||
/* Print message */
|
/* Get drive number */
|
||||||
movw $msgUnavailable, %si
|
cmpb $0xFF, DriveNumber - Start(%bp)
|
||||||
call Print
|
jne GetDriveParameters
|
||||||
|
movb %dl, DriveNumber - Start(%bp)
|
||||||
|
|
||||||
/* Wait for key press and reboot */
|
GetDriveParameters:
|
||||||
xorw %ax, %ax
|
/* Get drive parameters from the BIOS */
|
||||||
int $0x16
|
movb DriveNumber - Start(%bp), %dl
|
||||||
int $0x19
|
movb $0x08, %ah
|
||||||
|
movb $0x00, %al
|
||||||
|
int $0x13
|
||||||
|
jnc GetDriveSize
|
||||||
|
movw $0xFFFF, %cx
|
||||||
|
movb %cl, %dh
|
||||||
|
|
||||||
|
GetDriveSize:
|
||||||
|
/* Get drive size from the BIOS */
|
||||||
|
movzbl %dh, %eax
|
||||||
|
incw %ax
|
||||||
|
movzbl %cl, %edx
|
||||||
|
andb $0x3F, %dl
|
||||||
|
mulw %dx
|
||||||
|
xchgb %cl, %ch
|
||||||
|
shrb $0x06, %ch
|
||||||
|
incw %cx
|
||||||
|
movzwl %cx, %ecx
|
||||||
|
mull %ecx
|
||||||
|
movl %eax, %edi
|
||||||
|
|
||||||
|
VerifyBiosParameterBlock:
|
||||||
|
/* Verify the FAT32 BPB */
|
||||||
|
cmpw $0x00, SectorsPerFat - Start(%bp)
|
||||||
|
jne FsError
|
||||||
|
cmpw $0x00, FsVersion - Start(%bp)
|
||||||
|
ja FsError
|
||||||
|
|
||||||
|
ReadExtraCode:
|
||||||
|
/* Read second VBR sector with extra boot code */
|
||||||
|
movl HiddenSectors - Start(%bp), %eax
|
||||||
|
addl $0x02, %eax
|
||||||
|
movw $0x01, %cx
|
||||||
|
xorw %bx, %bx
|
||||||
|
movw %bx, %es
|
||||||
|
movw $0x7E00, %bx
|
||||||
|
call ReadSectors
|
||||||
|
jmp StartSectors
|
||||||
|
|
||||||
|
ReadSectors:
|
||||||
|
/* Check for extended BIOS functions and use it only if available */
|
||||||
|
pushw %es
|
||||||
|
pushal
|
||||||
|
movb $0x41, %ah
|
||||||
|
movw $0x55AA, %bx
|
||||||
|
movb DriveNumber - Start(%bp), %dl
|
||||||
|
int $0x13
|
||||||
|
jc ReadCHS
|
||||||
|
cmpw $0xAA55, %bx
|
||||||
|
jne ReadCHS
|
||||||
|
testb $0x01, %cl
|
||||||
|
jz ReadCHS
|
||||||
|
|
||||||
|
/* Verify drive size and determine whether to use CHS or LBA */
|
||||||
|
cmpl %edi, %eax
|
||||||
|
jnb ReadLBA
|
||||||
|
|
||||||
|
ReadCHS:
|
||||||
|
/* Read sectors using CHS */
|
||||||
|
popal
|
||||||
|
pushal
|
||||||
|
xorl %edx, %edx
|
||||||
|
movzwl SectorsPerTrack - Start(%bp), %ecx
|
||||||
|
divl %ecx
|
||||||
|
incb %dl
|
||||||
|
movb %dl, %cl
|
||||||
|
movl %eax, %edx
|
||||||
|
shrl $0x10, %edx
|
||||||
|
divw NumberOfHeads - Start(%bp)
|
||||||
|
movb %dl, %dh
|
||||||
|
movb DriveNumber - Start(%bp), %dl
|
||||||
|
movb %al, %ch
|
||||||
|
rorb $0x01, %ah
|
||||||
|
rorb $0x01, %ah
|
||||||
|
orb %ah, %cl
|
||||||
|
movw $0x0201, %ax
|
||||||
|
int $0x13
|
||||||
|
jc DiskError
|
||||||
|
popal
|
||||||
|
incl %eax
|
||||||
|
movw %es, %dx
|
||||||
|
addw $0x20, %dx
|
||||||
|
movw %dx, %es
|
||||||
|
loop ReadCHS
|
||||||
|
popw %es
|
||||||
|
ret
|
||||||
|
|
||||||
|
ReadLBA:
|
||||||
|
/* Prepare DAP packet and read sectors using LBA */
|
||||||
|
popal
|
||||||
|
pushw %cx
|
||||||
|
pushal
|
||||||
|
pushw $0x00
|
||||||
|
pushw $0x00
|
||||||
|
pushl %eax
|
||||||
|
pushw %es
|
||||||
|
pushw %bx
|
||||||
|
pushw %cx
|
||||||
|
pushw $0x10
|
||||||
|
movw %sp, %si
|
||||||
|
movb DriveNumber - Start(%bp), %dl
|
||||||
|
movb $0x42, %ah
|
||||||
|
int $0x13
|
||||||
|
jc DiskError
|
||||||
|
addw $0x10, %sp
|
||||||
|
popal
|
||||||
|
popw %si
|
||||||
|
pushw %bx
|
||||||
|
movzwl %si, %ebx
|
||||||
|
addl %ebx, %eax
|
||||||
|
shll $0x05, %ebx
|
||||||
|
movw %es, %dx
|
||||||
|
addw %bx, %dx
|
||||||
|
movw %dx, %es
|
||||||
|
popw %bx
|
||||||
|
subw %si, %cx
|
||||||
|
jnz ReadLBA
|
||||||
|
popw %es
|
||||||
|
ret
|
||||||
|
|
||||||
|
DiskError:
|
||||||
|
/* Display disk error message and reboot */
|
||||||
|
movw $msgDiskError, %si
|
||||||
|
call Print
|
||||||
|
jmp Reboot
|
||||||
|
|
||||||
|
FsError:
|
||||||
|
/* Display FS error message and reboot */
|
||||||
|
movw $msgFsError, %si
|
||||||
|
call Print
|
||||||
|
jmp Reboot
|
||||||
|
|
||||||
Print:
|
Print:
|
||||||
/* Simple routine to print messages */
|
/* Simple routine to print messages */
|
||||||
@@ -105,9 +236,40 @@ Print:
|
|||||||
DonePrint:
|
DonePrint:
|
||||||
retw
|
retw
|
||||||
|
|
||||||
msgUnavailable:
|
Reboot:
|
||||||
.ascii "XTLDR requires EFI-based system!\r\nPress any key to restart\r\n"
|
/* Display a message, wait for a key press and reboot */
|
||||||
|
movw $msgAnyKey, %si
|
||||||
|
call Print
|
||||||
|
xorw %ax, %ax
|
||||||
|
int $0x16
|
||||||
|
int $0x19
|
||||||
|
|
||||||
|
msgAnyKey:
|
||||||
|
.ascii "Press any key to restart\r\n"
|
||||||
|
|
||||||
|
msgDiskError:
|
||||||
|
.ascii "Disk error\r\n"
|
||||||
|
|
||||||
|
msgFsError:
|
||||||
|
.ascii "File system error\r\n"
|
||||||
|
|
||||||
/* Fill the rest of the VBR with zeros and add VBR signature at the end */
|
/* Fill the rest of the VBR with zeros and add VBR signature at the end */
|
||||||
.fill (510 - (. - Start)), 1, 0
|
.fill (510 - (. - Start)), 1, 0
|
||||||
.word 0xAA55
|
.word 0xAA55
|
||||||
|
|
||||||
|
|
||||||
|
StartSectors:
|
||||||
|
/* Print message */
|
||||||
|
movw $msgUnavailable, %si
|
||||||
|
call Print
|
||||||
|
|
||||||
|
/* Wait for key press and reboot */
|
||||||
|
xorw %ax, %ax
|
||||||
|
int $0x16
|
||||||
|
int $0x19
|
||||||
|
|
||||||
|
msgUnavailable:
|
||||||
|
.ascii "XTLDR requires EFI-based system!\r\nPress any key to restart\r\n"
|
||||||
|
|
||||||
|
/* Fill the rest of the extra VBR with zeros */
|
||||||
|
.fill (1024 - (. - Start)), 1, 0
|
||||||
|
@@ -394,13 +394,6 @@ typedef struct _CPU_IDENTIFICATION
|
|||||||
USHORT Stepping;
|
USHORT Stepping;
|
||||||
CPU_VENDOR Vendor;
|
CPU_VENDOR Vendor;
|
||||||
UCHAR VendorName[13];
|
UCHAR VendorName[13];
|
||||||
UINT32 StandardFeaturesEcx;
|
|
||||||
UINT32 StandardFeaturesEdx;
|
|
||||||
UINT32 ExtendedFeaturesEcx;
|
|
||||||
UINT32 ExtendedFeaturesEdx;
|
|
||||||
UINT32 Standard7FeaturesEbx;
|
|
||||||
UINT32 Standard7FeaturesEcx;
|
|
||||||
UINT32 Standard7FeaturesEdx;
|
|
||||||
} CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
|
} CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
|
||||||
|
|
||||||
/* CPUID registers */
|
/* CPUID registers */
|
||||||
|
@@ -359,10 +359,6 @@ typedef struct _CPU_IDENTIFICATION
|
|||||||
USHORT Stepping;
|
USHORT Stepping;
|
||||||
CPU_VENDOR Vendor;
|
CPU_VENDOR Vendor;
|
||||||
UCHAR VendorName[13];
|
UCHAR VendorName[13];
|
||||||
UINT32 StandardFeaturesEcx;
|
|
||||||
UINT32 StandardFeaturesEdx;
|
|
||||||
UINT32 ExtendedFeaturesEcx;
|
|
||||||
UINT32 ExtendedFeaturesEdx;
|
|
||||||
} CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
|
} CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
|
||||||
|
|
||||||
/* CPUID registers */
|
/* CPUID registers */
|
||||||
|
@@ -64,6 +64,9 @@ AR::ProcSup::IdentifyProcessor(VOID)
|
|||||||
CPUID_REGISTERS CpuRegisters;
|
CPUID_REGISTERS CpuRegisters;
|
||||||
CPUID_SIGNATURE CpuSignature;
|
CPUID_SIGNATURE CpuSignature;
|
||||||
|
|
||||||
|
/* Not fully implemented yet */
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
|
||||||
/* Get current processor control block */
|
/* Get current processor control block */
|
||||||
Prcb = KE::Processor::GetCurrentProcessorControlBlock();
|
Prcb = KE::Processor::GetCurrentProcessorControlBlock();
|
||||||
|
|
||||||
@@ -119,42 +122,7 @@ AR::ProcSup::IdentifyProcessor(VOID)
|
|||||||
Prcb->CpuId.Vendor = CPU_VENDOR_UNKNOWN;
|
Prcb->CpuId.Vendor = CPU_VENDOR_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get CPU standard features */
|
/* TODO: Store a list of CPU features in processor control block */
|
||||||
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
|
|
||||||
CpuRegisters.Leaf = CPUID_GET_STANDARD1_FEATURES;
|
|
||||||
CpuFunc::CpuId(&CpuRegisters);
|
|
||||||
|
|
||||||
/* Store CPU standard features in processor control block */
|
|
||||||
Prcb->CpuId.StandardFeaturesEcx = CpuRegisters.Ecx;
|
|
||||||
Prcb->CpuId.StandardFeaturesEdx = CpuRegisters.Edx;
|
|
||||||
|
|
||||||
/* Get CPU extended features */
|
|
||||||
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
|
|
||||||
CpuRegisters.Leaf = 0x80000001;
|
|
||||||
CpuFunc::CpuId(&CpuRegisters);
|
|
||||||
|
|
||||||
/* Store CPU extended features in processor control block */
|
|
||||||
Prcb->CpuId.ExtendedFeaturesEcx = CpuRegisters.Ecx;
|
|
||||||
Prcb->CpuId.ExtendedFeaturesEdx = CpuRegisters.Edx;
|
|
||||||
|
|
||||||
/* Get CPU leaf 7 features (subleaf 0) */
|
|
||||||
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
|
|
||||||
CpuRegisters.Leaf = CPUID_GET_STANDARD7_FEATURES;
|
|
||||||
CpuRegisters.SubLeaf = 0;
|
|
||||||
CpuFunc::CpuId(&CpuRegisters);
|
|
||||||
|
|
||||||
/* Store CPU leaf 7 features in processor control block */
|
|
||||||
Prcb->CpuId.Standard7FeaturesEbx = CpuRegisters.Ebx;
|
|
||||||
Prcb->CpuId.Standard7FeaturesEcx = CpuRegisters.Ecx;
|
|
||||||
Prcb->CpuId.Standard7FeaturesEdx = CpuRegisters.Edx;
|
|
||||||
|
|
||||||
/* Print CPU information */
|
|
||||||
DebugPrint(L"CPU: Vendor %hs, Family 0x%X, Model 0x%X, Stepping 0x%X\n",
|
|
||||||
Prcb->CpuId.VendorName,
|
|
||||||
Prcb->CpuId.Family,
|
|
||||||
Prcb->CpuId.Model,
|
|
||||||
Prcb->CpuId.Stepping);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -59,6 +59,9 @@ AR::ProcSup::IdentifyProcessor(VOID)
|
|||||||
CPUID_REGISTERS CpuRegisters;
|
CPUID_REGISTERS CpuRegisters;
|
||||||
CPUID_SIGNATURE CpuSignature;
|
CPUID_SIGNATURE CpuSignature;
|
||||||
|
|
||||||
|
/* Not fully implemented yet */
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
|
||||||
/* Get current processor control block */
|
/* Get current processor control block */
|
||||||
Prcb = KE::Processor::GetCurrentProcessorControlBlock();
|
Prcb = KE::Processor::GetCurrentProcessorControlBlock();
|
||||||
|
|
||||||
@@ -114,30 +117,7 @@ AR::ProcSup::IdentifyProcessor(VOID)
|
|||||||
Prcb->CpuId.Vendor = CPU_VENDOR_UNKNOWN;
|
Prcb->CpuId.Vendor = CPU_VENDOR_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get CPU standard features */
|
/* TODO: Store a list of CPU features in processor control block */
|
||||||
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
|
|
||||||
CpuRegisters.Leaf = CPUID_GET_STANDARD1_FEATURES;
|
|
||||||
CpuFunc::CpuId(&CpuRegisters);
|
|
||||||
|
|
||||||
/* Store CPU standard features in processor control block */
|
|
||||||
Prcb->CpuId.StandardFeaturesEcx = CpuRegisters.Ecx;
|
|
||||||
Prcb->CpuId.StandardFeaturesEdx = CpuRegisters.Edx;
|
|
||||||
|
|
||||||
/* Get CPU extended features */
|
|
||||||
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
|
|
||||||
CpuRegisters.Leaf = 0x80000001;
|
|
||||||
CpuFunc::CpuId(&CpuRegisters);
|
|
||||||
|
|
||||||
/* Store CPU extended features in processor control block */
|
|
||||||
Prcb->CpuId.ExtendedFeaturesEcx = CpuRegisters.Ecx;
|
|
||||||
Prcb->CpuId.ExtendedFeaturesEdx = CpuRegisters.Edx;
|
|
||||||
|
|
||||||
/* Print CPU information */
|
|
||||||
DebugPrint(L"CPU: Vendor %hs, Family 0x%X, Model 0x%X, Stepping 0x%X\n",
|
|
||||||
Prcb->CpuId.VendorName,
|
|
||||||
Prcb->CpuId.Family,
|
|
||||||
Prcb->CpuId.Model,
|
|
||||||
Prcb->CpuId.Stepping);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user