forked from xt-sys/exectos
Compare commits
348 Commits
ed293c7e61
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
cd4e905054
|
|||
|
715419abe7
|
|||
|
d37f2e3827
|
|||
|
cec5e8b16b
|
|||
|
a08e07e515
|
|||
|
d7f390b236
|
|||
|
55cb12c978
|
|||
|
7d8bfa8f0a
|
|||
|
d00e96baa4
|
|||
|
17f044cb3f
|
|||
|
1fa6e90439
|
|||
|
f15790e25b
|
|||
|
53c5946c04
|
|||
|
9ffb03217a
|
|||
|
4f65773aa9
|
|||
|
f1476912f3
|
|||
|
adb591f8c7
|
|||
|
4ef068dadc
|
|||
|
a0d5ee17c2
|
|||
|
9935d2d26b
|
|||
|
9eff9874c5
|
|||
|
09516835d0
|
|||
|
2a24ce9a35
|
|||
|
9ea79c92a6
|
|||
|
c30df8e5b5
|
|||
|
397d0a9f29
|
|||
|
0fa23ccf40
|
|||
|
87a91bfeb1
|
|||
|
232b92fd7e
|
|||
|
d88f9f0a15
|
|||
|
154b2062ba
|
|||
|
38d49eece4
|
|||
|
d00577ac8d
|
|||
|
620fc24cd2
|
|||
|
494b615dc2
|
|||
|
d834b7e0c8
|
|||
|
987b8f45d7
|
|||
|
52ecbdeaff
|
|||
|
121f461491
|
|||
|
f4b189adef
|
|||
|
40c4860548
|
|||
|
d2a7ae46ac
|
|||
|
8a02a5aca3
|
|||
|
96df5a80b8
|
|||
|
489ef8a514
|
|||
|
8c6c63465f
|
|||
|
e9aaeab982
|
|||
|
a608b26fde
|
|||
|
3ce009db41
|
|||
|
a0b0938099
|
|||
|
32d3672a51
|
|||
|
0c17337388
|
|||
|
9c449bed43
|
|||
|
a64aa83eb8
|
|||
|
64b5de98c8
|
|||
|
4e02664977
|
|||
|
bad3aaf6e0
|
|||
|
9b19bc94b3
|
|||
|
9479f3d364
|
|||
|
8d97ea4112
|
|||
|
40d54743e0
|
|||
|
576a2b7f1b
|
|||
|
3c2ad358ef
|
|||
|
e734ddda65
|
|||
|
a79f26250a
|
|||
|
441e4f510b
|
|||
|
33665839ad
|
|||
|
1e01c52c0c
|
|||
|
970902f3f9
|
|||
|
adff181f5a
|
|||
|
92986e1386
|
|||
|
9a34a5f735
|
|||
|
398db4bde1
|
|||
|
719564ba74
|
|||
|
b95613787a
|
|||
|
4292d89185
|
|||
|
214051e873
|
|||
|
3c52b88802
|
|||
|
944d5b5c0a
|
|||
|
597628a644
|
|||
|
b97babb2bf
|
|||
|
caacd9e275
|
|||
|
916d124c9b
|
|||
|
d85e313c15
|
|||
|
b83eaaa820
|
|||
|
233440c8be
|
|||
|
140af4278e
|
|||
|
c67372d747
|
|||
|
e2eff2b836
|
|||
|
930c9d3193
|
|||
|
f862871a1f
|
|||
|
afb20a1796
|
|||
|
876923e107
|
|||
|
3d7fe25471
|
|||
|
184ce5735e
|
|||
|
76d99dc9db
|
|||
|
d401ac4540
|
|||
|
22f9525e92
|
|||
|
80092a299e
|
|||
|
42525e5993
|
|||
|
0fed593147
|
|||
|
6cdb66cbb3
|
|||
|
d263f17831
|
|||
|
6175413db2
|
|||
|
428928c7e1
|
|||
|
7d2b41a044
|
|||
|
5fe0740c2e
|
|||
|
35eac9d34c
|
|||
|
5a78512561
|
|||
|
b7a92ccce4
|
|||
|
8d2dfa6f62
|
|||
|
5a9b7c0258
|
|||
|
5368fe2e8d
|
|||
|
3e1f57f67c
|
|||
|
44f27fad28
|
|||
|
ae8ac1eacb
|
|||
|
a72bfd3902
|
|||
|
7bdd0dfe2c
|
|||
|
5778a761b5
|
|||
|
d7d125dd50
|
|||
|
511dd15c0c
|
|||
|
278def3081
|
|||
|
0658e98436
|
|||
|
bfdb7bc476
|
|||
|
44fa2ca13a
|
|||
|
7a44901064
|
|||
|
7144242613
|
|||
|
7e62919c6b
|
|||
|
a136f21f4b
|
|||
|
2bbc21b667
|
|||
|
70d758ec5b
|
|||
|
d1553ff84a
|
|||
|
94a8917c5c
|
|||
|
f7b7b61ea4
|
|||
|
2af94a1c3b
|
|||
|
4b5188260f
|
|||
|
47ec89a85e
|
|||
|
edb40dd62b
|
|||
|
e2da6220f2
|
|||
|
53f7945771
|
|||
|
9a5ef6fc00
|
|||
|
fa64507350
|
|||
|
80ea0b49d0
|
|||
|
2e0e085acb
|
|||
|
0ce2741e18
|
|||
|
a46f30045a
|
|||
|
0763a9522b
|
|||
|
b51f21f55c
|
|||
|
0590ad3bcd
|
|||
|
9b8417565b
|
|||
|
bc391d6e1e
|
|||
|
7b6e284d39
|
|||
|
fae72f5326
|
|||
|
eb0957dbd4
|
|||
|
3d7f512377
|
|||
|
7f0341bb83
|
|||
|
ba4ac6cec8
|
|||
|
b16dbb19f8
|
|||
|
19f5307be6
|
|||
|
825de8b471
|
|||
|
6a7bc64ac7
|
|||
|
726fd84241
|
|||
|
54e75c9345
|
|||
|
5e3fb7a5a3
|
|||
|
58669d3074
|
|||
|
72f34c8286
|
|||
|
a7820ff568
|
|||
|
7f6114f8e5
|
|||
|
fd29cf55ef
|
|||
|
446ce920ec
|
|||
|
a4b9f495e5
|
|||
|
2c8eb6d692
|
|||
|
31b0e4f441
|
|||
|
b5f220a2ae
|
|||
|
0b1b76e9df
|
|||
|
d3edfef53b
|
|||
|
46c24e653e
|
|||
|
c3607ea943
|
|||
|
7da6bcc75e
|
|||
|
0f38d39705
|
|||
|
587b85d0a4
|
|||
|
0766eb4566
|
|||
|
11f7c25713
|
|||
|
15edd98242
|
|||
|
34c33a3b53
|
|||
|
032cab7f2f
|
|||
|
5500192575
|
|||
|
ec94e2341c
|
|||
|
9ed851ed1f
|
|||
|
b91c79e090
|
|||
|
bee91d0c71
|
|||
|
36e53bfc8c
|
|||
|
9027632c4f
|
|||
|
bd1a3605d2
|
|||
|
4b50278ac9
|
|||
|
154ca7be35
|
|||
|
3a087766cc
|
|||
|
410286d012
|
|||
|
e66baa0da0
|
|||
|
46576398a2
|
|||
|
cb6efc648f
|
|||
|
0a43a93f41
|
|||
|
9f359c10ed
|
|||
|
455349f2d7
|
|||
|
5e5b4a8392
|
|||
|
329143b4f6
|
|||
|
cc76ea40ee
|
|||
|
0159262ee0
|
|||
|
f653b9f79c
|
|||
|
7bcd78fdf3
|
|||
|
c080f74714
|
|||
|
5ff0cad094
|
|||
|
00702bfb23
|
|||
|
dbda6bbb29
|
|||
|
aced62e790
|
|||
|
53116b86a3
|
|||
|
d8fc223140
|
|||
|
f4c49e2f25
|
|||
|
4c7c914a1c
|
|||
|
4a00179af2
|
|||
|
0d2d41dcda
|
|||
|
c1514557f6
|
|||
|
49e97fb8b4
|
|||
|
28f49dd545
|
|||
|
7cb3d1764b
|
|||
|
200e9132b1
|
|||
|
d891088b1a
|
|||
|
04599161da
|
|||
|
0880a0f344
|
|||
|
4593a89a9b
|
|||
|
874d303f83
|
|||
|
b7c004528a
|
|||
|
5012c8dc37
|
|||
|
1e3917882c
|
|||
|
b3b874d3ce
|
|||
|
288b2f8b24
|
|||
|
c7cc536685
|
|||
|
b8e81e2223
|
|||
|
0fd2b8b729
|
|||
|
560cd43b34
|
|||
|
f0a06db7d2
|
|||
|
7575526f07
|
|||
|
643fd0d1e8
|
|||
|
6aa148784b
|
|||
|
e237a944cc
|
|||
|
755a167f2c
|
|||
|
24dccf4bed
|
|||
|
7b93c39348
|
|||
|
570301bb35
|
|||
|
b183d52806
|
|||
|
687c58d923
|
|||
|
049c9c6bbd
|
|||
|
f1a76bc01a
|
|||
|
cb4d113e31
|
|||
|
728241f998
|
|||
|
00d428d8de
|
|||
|
020b7c7676
|
|||
|
2265a4a522
|
|||
|
dc23f91110
|
|||
|
7f0ca6a948
|
|||
|
36c273ea13
|
|||
|
5cf3dfa844
|
|||
|
070c508e42
|
|||
|
5224dc315f
|
|||
|
b7bbf9ffa8
|
|||
|
eae48320f3
|
|||
|
17b5649362
|
|||
|
783a9eea3a
|
|||
|
237f6a2974
|
|||
|
ee9514fd5c
|
|||
|
63c27a149a
|
|||
|
7694df7744
|
|||
|
c710ec4688
|
|||
|
8054bb915a
|
|||
|
86aa22e5f8
|
|||
|
4a7494ad3f
|
|||
|
d4287198b0
|
|||
|
4265ae92d0
|
|||
|
931586eebd
|
|||
|
c099882866
|
|||
|
0097cb88d7
|
|||
|
20b0bfdfad
|
|||
|
35523a230a
|
|||
|
7b11a8feb1
|
|||
|
0cf178a648
|
|||
|
66f27e4b9a
|
|||
|
10b8ab347a
|
|||
|
071c840ca8
|
|||
|
dda8f88830
|
|||
|
cb2da54956
|
|||
|
fd13091476
|
|||
|
c28c3f8344
|
|||
|
dfb0284427
|
|||
|
1150b9ecdb
|
|||
|
f6dac12057
|
|||
|
ffa480d69a
|
|||
|
0120ba167f
|
|||
|
4e9dc15501
|
|||
|
164ff0c135
|
|||
|
f538d035e2
|
|||
|
72b92f853e
|
|||
|
00b04f5405
|
|||
|
52afd31e77
|
|||
|
7f06abf236
|
|||
|
4f4df52d3d
|
|||
|
764fec4d75
|
|||
|
ca8a539c0e
|
|||
|
c206b443ed
|
|||
|
b19b27a621
|
|||
|
56b81f5d73
|
|||
|
1e99a3f4a9
|
|||
|
0a71bc3995
|
|||
|
13a9d4c522
|
|||
|
9bf867af95
|
|||
|
a7be533521
|
|||
|
fdbe157c18
|
|||
|
56a1a811b9
|
|||
|
32bacdd228
|
|||
|
2d4c82cd29
|
|||
|
e5611d8081
|
|||
|
e52977fb63
|
|||
|
11f096d9f3
|
|||
|
6e507be5e9
|
|||
|
6a8a561484
|
|||
|
c5f522be4c
|
|||
|
ce8041754b
|
|||
|
c4af89946b
|
|||
|
95fecfc095
|
|||
|
ec4e8c416c
|
|||
|
64733914f2
|
|||
|
4e7baf302c
|
|||
|
2f9a6b5548
|
|||
|
646e246ec6
|
|||
|
ae941d2761
|
|||
|
b40db0d1dd
|
|||
|
cf4c17df22
|
|||
|
f152e2bac7
|
|||
|
f81e895fe1
|
|||
|
370a635ee2
|
|||
|
4696faf86d
|
|||
|
332e57f305
|
|||
|
4ee3daa8f8
|
|||
|
ee82475aa3
|
|||
|
ff0caf93da
|
|||
|
20fd950ef4
|
|||
|
6e10089280
|
|||
|
9298aef87e
|
|||
|
6c66028800
|
@@ -55,16 +55,18 @@ add_definitions(-D__XTOS__)
|
|||||||
add_definitions(-DXTOS_SOURCE_DIR="${EXECTOS_SOURCE_DIR}")
|
add_definitions(-DXTOS_SOURCE_DIR="${EXECTOS_SOURCE_DIR}")
|
||||||
add_definitions(-DXTOS_BINARY_DIR="${EXECTOS_BINARY_DIR}")
|
add_definitions(-DXTOS_BINARY_DIR="${EXECTOS_BINARY_DIR}")
|
||||||
|
|
||||||
|
# Add assembler flags
|
||||||
|
add_compiler_asmflags(-D__XTOS_ASSEMBLER__)
|
||||||
|
|
||||||
# Compute __FILE__ definition
|
# Compute __FILE__ definition
|
||||||
file(RELATIVE_PATH _PATH_PREFIX ${EXECTOS_BINARY_DIR} ${EXECTOS_SOURCE_DIR})
|
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(bootdata)
|
add_subdirectory(boot)
|
||||||
add_subdirectory(drivers)
|
add_subdirectory(drivers)
|
||||||
add_subdirectory(sdk)
|
add_subdirectory(sdk)
|
||||||
add_subdirectory(xtldr)
|
|
||||||
add_subdirectory(xtoskrnl)
|
add_subdirectory(xtoskrnl)
|
||||||
|
|||||||
@@ -9,8 +9,7 @@ porting drivers, fixing bugs, writing tests, creating documentation, or helping
|
|||||||
love the help.
|
love the help.
|
||||||
|
|
||||||
## Wish List
|
## Wish List
|
||||||
If you are looking for a way to contribute, but you are not sure where to start, check our [IDEAS](IDEAS.md) and
|
If you are looking for a way to contribute, but you are not sure where to start, check our list of
|
||||||
[KNOWN ISSUES](KNOWN_ISSUES.md) pages for suggestions. We try to keep them up to date. You can also check a list of
|
|
||||||
[open issues](https://git.codingworkshop.eu.org/xt-sys/exectos/issues). If you find interesting task and you are serious
|
[open issues](https://git.codingworkshop.eu.org/xt-sys/exectos/issues). If you find interesting task and you are serious
|
||||||
about tackling one, feel free to contact us. We will be able to provide a more detailed information and suggestions
|
about tackling one, feel free to contact us. We will be able to provide a more detailed information and suggestions
|
||||||
towards getting started.
|
towards getting started.
|
||||||
|
|||||||
23
IDEAS.md
23
IDEAS.md
@@ -1,23 +0,0 @@
|
|||||||
## ExectOS Ideas
|
|
||||||
This is a list of ideas that migh but not must be realized.
|
|
||||||
|
|
||||||
### SDK
|
|
||||||
- [ ] Currently XT Development Kit (XTDK) is a garbage. It should be cleaned up the way, it contains all structures
|
|
||||||
and definitions, as well as all routines that are exported and can be used by other components or software
|
|
||||||
dynamically linked. All other routines should be available as well in some form, as some libraries can share
|
|
||||||
code with others (eg. XTLDR calls routines exported by XTOSKRNL). This is partially done, as XTDK has been
|
|
||||||
cleaned up, but still there are routines used by XTLDR.
|
|
||||||
|
|
||||||
### XTLDR
|
|
||||||
- [ ] Rewrite memory mapping and paging support in bootloader to make it more flexible and architecture independent.
|
|
||||||
This should support paging levels, thus allowing to make a use of PML5 on modern AMD64 processors and increasing
|
|
||||||
the addressable virtual memory from 256TB to 128PB. This is partially done.
|
|
||||||
- [ ] Implement editing boot menu entries directly from the boot menu. Changes should be runtime only (not stored on
|
|
||||||
disk).
|
|
||||||
|
|
||||||
### XTOSKRNL
|
|
||||||
- [ ] Implement mechanism for detecting CPU features and checking hardware requirements. If CPU does not meet
|
|
||||||
requirements, it should cause a kernel panic before any non-supported instruction is being used.
|
|
||||||
- [ ] Finish framebuffer and terminal implementation. Initialization code is already prepared as well as routines for
|
|
||||||
clearing the screen and drawing single points. Terminal should be instantiable (should be able to create many
|
|
||||||
terminals and switch between them) and work on top of FB. It should define ANSI colors and scrollback buffer.
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
## ExectOS Known Issues
|
|
||||||
This is a list of well known bugs that exists in all master branch builds.
|
|
||||||
|
|
||||||
### XTLDR
|
|
||||||
- [ ] EFI Runtime Services are not mapped properly into higher half. They are mapped itself, but all pointers inside
|
|
||||||
that structure point to some physical address that is unavailable after paging is enabled.
|
|
||||||
27
README.md
27
README.md
@@ -53,20 +53,23 @@ implement any environment subsystem to support applications that are strictly wr
|
|||||||
* NT drivers compatibility layer
|
* NT drivers compatibility layer
|
||||||
|
|
||||||
# Requirements
|
# Requirements
|
||||||
ExectOS is in very early development stage, thus its requirements have been not specified yet. However according to its
|
ExectOS is currently in a very early stage of development, so its specific requirements are not fully defined yet.
|
||||||
design, it requires a modern EFI enabled hardware. It is not possible currently to boot ExectOS on a legacy BIOS.
|
However, based on the current design, it requires modern EFI hardware. You cannot boot ExectOS on a legacy BIOS
|
||||||
|
right now, but there are plans to add BIOS support in the future.
|
||||||
|
|
||||||
# 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
|
||||||
|
|||||||
3
boot/CMakeLists.txt
Normal file
3
boot/CMakeLists.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
add_subdirectory(bootdata)
|
||||||
|
add_subdirectory(bootsect)
|
||||||
|
add_subdirectory(xtldr)
|
||||||
8
boot/bootsect/CMakeLists.txt
Normal file
8
boot/bootsect/CMakeLists.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# XT Boot Sector
|
||||||
|
PROJECT(BOOTSECT)
|
||||||
|
|
||||||
|
add_definitions("-DARCH_ESP_SOURCE=\\\"${ARCH}/cpu.S\\\"")
|
||||||
|
|
||||||
|
# Compile boot sectors
|
||||||
|
compile_bootsector(mbrboot ${BOOTSECT_SOURCE_DIR}/mbrboot.S 0x7C00 Start)
|
||||||
|
compile_bootsector(espboot ${BOOTSECT_SOURCE_DIR}/espboot.S 0x7C00 Start)
|
||||||
144
boot/bootsect/amd64/cpu.S
Normal file
144
boot/bootsect/amd64/cpu.S
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
/**
|
||||||
|
* PROJECT: ExectOS
|
||||||
|
* COPYRIGHT: See COPYING.md in the top level directory
|
||||||
|
* FILE: boot/bootsect/amd64/cpu.S
|
||||||
|
* DESCRIPTION: Low-level support for CPU initialization
|
||||||
|
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
BuildPageMap:
|
||||||
|
/* Generate page map for first 1GB of memory */
|
||||||
|
pushaw
|
||||||
|
pushw %es
|
||||||
|
cld
|
||||||
|
movw $(0x1000 / 16), %ax
|
||||||
|
movw %ax, %es
|
||||||
|
xorw %di, %di
|
||||||
|
movl $(0x2000 | 0x07), %eax
|
||||||
|
stosl
|
||||||
|
xorl %eax, %eax
|
||||||
|
movw $1021, %cx
|
||||||
|
rep stosl
|
||||||
|
movw $(0x2000 / 16), %ax
|
||||||
|
movw %ax, %es
|
||||||
|
xorw %di, %di
|
||||||
|
movl $(0x3000 | 0x07), %eax
|
||||||
|
stosl
|
||||||
|
xorl %eax, %eax
|
||||||
|
movw $1021, %cx
|
||||||
|
rep stosl
|
||||||
|
movw $(0x3000 / 16), %ax
|
||||||
|
movw %ax, %es
|
||||||
|
xorw %di, %di
|
||||||
|
movw $512, %cx
|
||||||
|
movl $0x00000083, %eax
|
||||||
|
.BuildPageMapLoop:
|
||||||
|
/* Identity map 512 pages of 2MB */
|
||||||
|
movl %eax, %es:(%di)
|
||||||
|
addl $2097152, %eax
|
||||||
|
addw $0x08, %di
|
||||||
|
loop .BuildPageMapLoop
|
||||||
|
popw %es
|
||||||
|
popaw
|
||||||
|
ret
|
||||||
|
|
||||||
|
InitializeCpu:
|
||||||
|
/* Check if CPU supports CPUID, long mode and PAE */
|
||||||
|
pushal
|
||||||
|
pushfl
|
||||||
|
popl %eax
|
||||||
|
movl %eax, %ebx
|
||||||
|
xorl $0x00200000, %eax
|
||||||
|
pushl %eax
|
||||||
|
popfl
|
||||||
|
pushfl
|
||||||
|
popl %eax
|
||||||
|
cmpl %ebx, %eax
|
||||||
|
je CpuUnsupported
|
||||||
|
movl $0x01, %eax
|
||||||
|
cpuid
|
||||||
|
testl $0x40, %edx
|
||||||
|
jz CpuUnsupported
|
||||||
|
movl $0x80000000, %eax
|
||||||
|
cpuid
|
||||||
|
cmpl $0x80000000, %eax
|
||||||
|
jbe CpuUnsupported
|
||||||
|
movl $0x80000001, %eax
|
||||||
|
cpuid
|
||||||
|
testl $0x20000000, %edx
|
||||||
|
jz CpuUnsupported
|
||||||
|
popal
|
||||||
|
call LoadGdt
|
||||||
|
ret
|
||||||
|
|
||||||
|
LoadGdt:
|
||||||
|
/* Load Global Descriptor Table */
|
||||||
|
lgdt .GdtPointer
|
||||||
|
ret
|
||||||
|
|
||||||
|
RunStage2:
|
||||||
|
/* Switch to long mode and pass control to Stage 2 */
|
||||||
|
call BuildPageMap
|
||||||
|
call ParseExecutableHeader
|
||||||
|
xorl %edx, %edx
|
||||||
|
pushl %edx
|
||||||
|
pushl %eax
|
||||||
|
cli
|
||||||
|
xorw %ax, %ax
|
||||||
|
movw %ax, %ds
|
||||||
|
movw %ax, %es
|
||||||
|
movw %ax, %fs
|
||||||
|
movw %ax, %gs
|
||||||
|
movw %ax, %ss
|
||||||
|
movl %cr4, %eax
|
||||||
|
orl $0x00A0, %eax
|
||||||
|
movl %eax, %cr4
|
||||||
|
movl $0x00001000, %eax
|
||||||
|
movl %eax, %cr3
|
||||||
|
movl $0xC0000080, %ecx
|
||||||
|
rdmsr
|
||||||
|
orl $0x00000100, %eax
|
||||||
|
wrmsr
|
||||||
|
movl %cr0, %eax
|
||||||
|
orl $0x80000001, %eax
|
||||||
|
movl %eax, %cr0
|
||||||
|
ljmp $0x10, $.Stage2LongMode
|
||||||
|
.code64
|
||||||
|
.Stage2LongMode:
|
||||||
|
/* Set segments and stack, then jump to Stage 2 */
|
||||||
|
movw $0x18, %ax
|
||||||
|
movw %ax, %ds
|
||||||
|
movw %ax, %es
|
||||||
|
movw %ax, %ss
|
||||||
|
xorw %ax, %ax
|
||||||
|
movw %ax, %fs
|
||||||
|
movw %ax, %gs
|
||||||
|
popq %rax
|
||||||
|
xorq %rbx, %rbx
|
||||||
|
xorq %rcx, %rcx
|
||||||
|
xorq %rdx, %rdx
|
||||||
|
xorq %rsi, %rsi
|
||||||
|
xorq %rdi, %rdi
|
||||||
|
xorq %rbp, %rbp
|
||||||
|
jmp *%rax
|
||||||
|
|
||||||
|
.code16
|
||||||
|
.GdtDescriptor:
|
||||||
|
/* Global Descriptor Table */
|
||||||
|
.quad 0x0000000000000000
|
||||||
|
.quad 0x0000000000000000
|
||||||
|
.quad 0x00AF9A000000FFFF
|
||||||
|
.quad 0x00CF92000000FFFF
|
||||||
|
.quad 0x00009E000000FFFF
|
||||||
|
.quad 0x000092000000FFFF
|
||||||
|
.quad 0x00CF9B000000FFFF
|
||||||
|
|
||||||
|
.GdtPointer:
|
||||||
|
/* Pointer to Global Descriptor Table */
|
||||||
|
.word .GdtPointer - .GdtDescriptor - 1
|
||||||
|
.long .GdtDescriptor
|
||||||
|
|
||||||
|
.Stage2FileName:
|
||||||
|
/* Name of Stage 2 executable file */
|
||||||
|
.ascii "BOOTX64 EFI"
|
||||||
529
boot/bootsect/espboot.S
Normal file
529
boot/bootsect/espboot.S
Normal file
@@ -0,0 +1,529 @@
|
|||||||
|
/**
|
||||||
|
* PROJECT: ExectOS
|
||||||
|
* COPYRIGHT: See COPYING.md in the top level directory
|
||||||
|
* FILE: boot/bootsect/espboot.S
|
||||||
|
* DESCRIPTION: XT Boot Loader ESP boot code (FAT32)
|
||||||
|
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.code16
|
||||||
|
|
||||||
|
|
||||||
|
.global Start
|
||||||
|
Start:
|
||||||
|
/* Jump to the real start to omit the BPB (BIOS Parameter Block) */
|
||||||
|
jmp RealStart
|
||||||
|
nop
|
||||||
|
|
||||||
|
/* BIOS Parameter Block */
|
||||||
|
OsName:
|
||||||
|
.ascii "XTOS "
|
||||||
|
OsVersion:
|
||||||
|
.ascii "1.0"
|
||||||
|
BytesPerSector:
|
||||||
|
.word 512
|
||||||
|
SectorsPerCluster:
|
||||||
|
.byte 2
|
||||||
|
ReservedSectors:
|
||||||
|
.word 8
|
||||||
|
FatCopies:
|
||||||
|
.byte 1
|
||||||
|
RootDirEntries:
|
||||||
|
.word 1024
|
||||||
|
TotalSectors:
|
||||||
|
.word 0
|
||||||
|
MediaType:
|
||||||
|
.byte 0xF8
|
||||||
|
SectorsPerFat:
|
||||||
|
.word 0
|
||||||
|
SectorsPerTrack:
|
||||||
|
.word 17
|
||||||
|
NumberOfHeads:
|
||||||
|
.word 0
|
||||||
|
HiddenSectors:
|
||||||
|
.long 0
|
||||||
|
TotalBigSectors:
|
||||||
|
.long 0x200000
|
||||||
|
BigSectorsPerFat:
|
||||||
|
.long 0x1FE0
|
||||||
|
ExtendedFlags:
|
||||||
|
.word 0
|
||||||
|
FsVersion:
|
||||||
|
.word 0
|
||||||
|
RootDirStartCluster:
|
||||||
|
.long 0
|
||||||
|
FSInfoSector:
|
||||||
|
.word 0
|
||||||
|
BackupBootSector:
|
||||||
|
.word 6
|
||||||
|
Reserved:
|
||||||
|
.fill 12, 1, 0
|
||||||
|
DriveNumber:
|
||||||
|
.byte 0x80
|
||||||
|
CurrentHead:
|
||||||
|
.byte 0
|
||||||
|
Signature:
|
||||||
|
.byte 0x29
|
||||||
|
SerialNumber:
|
||||||
|
.long 0
|
||||||
|
VolumeLabel:
|
||||||
|
.ascii "NO NAME "
|
||||||
|
FileSystem:
|
||||||
|
.ascii "FAT32 "
|
||||||
|
|
||||||
|
RealStart:
|
||||||
|
/* Set segments and stack */
|
||||||
|
cli
|
||||||
|
cld
|
||||||
|
xorw %ax, %ax
|
||||||
|
movw %ax, %ds
|
||||||
|
movw %ax, %es
|
||||||
|
movw %ax, %ss
|
||||||
|
movw $0x7C00, %bp
|
||||||
|
leaw -16(%bp), %sp
|
||||||
|
sti
|
||||||
|
|
||||||
|
/* Get drive number */
|
||||||
|
cmpb $0xFF, DriveNumber - Start(%bp)
|
||||||
|
jne GetDriveParameters
|
||||||
|
movb %dl, DriveNumber - Start(%bp)
|
||||||
|
|
||||||
|
GetDriveParameters:
|
||||||
|
/* Get drive parameters from the BIOS */
|
||||||
|
movb DriveNumber - Start(%bp), %dl
|
||||||
|
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 (3 sectors starting from sector 2) */
|
||||||
|
movl HiddenSectors - Start(%bp), %eax
|
||||||
|
addl $0x02, %eax
|
||||||
|
movw $0x03, %cx
|
||||||
|
xorw %bx, %bx
|
||||||
|
movw %bx, %es
|
||||||
|
movw $0x7E00, %bx
|
||||||
|
call ReadSectors
|
||||||
|
jmp StartExtraCode
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
.CHSLoop:
|
||||||
|
/* Read sector by sector using CHS */
|
||||||
|
pushw %cx
|
||||||
|
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
|
||||||
|
popal
|
||||||
|
popw %cx
|
||||||
|
jc DiskError
|
||||||
|
incl %eax
|
||||||
|
movw %es, %dx
|
||||||
|
addw $0x20, %dx
|
||||||
|
movw %dx, %es
|
||||||
|
loop .CHSLoop
|
||||||
|
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:
|
||||||
|
/* Simple routine to print messages */
|
||||||
|
lodsb
|
||||||
|
orb %al, %al
|
||||||
|
jz .DonePrint
|
||||||
|
movb $0x0E, %ah
|
||||||
|
movw $0x07, %bx
|
||||||
|
int $0x10
|
||||||
|
jmp Print
|
||||||
|
.DonePrint:
|
||||||
|
retw
|
||||||
|
|
||||||
|
Reboot:
|
||||||
|
/* 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\0"
|
||||||
|
|
||||||
|
.MsgDiskError:
|
||||||
|
.ascii "Disk error!\r\n\0"
|
||||||
|
|
||||||
|
.MsgFsError:
|
||||||
|
.ascii "File system error!\r\n\0"
|
||||||
|
|
||||||
|
/* Fill the rest of the VBR with zeros and add VBR signature at the end */
|
||||||
|
.fill (510 - (. - Start)), 1, 0
|
||||||
|
.word 0xAA55
|
||||||
|
|
||||||
|
|
||||||
|
StartExtraCode:
|
||||||
|
/* Load XTLDR file from disk */
|
||||||
|
call LoadStage2
|
||||||
|
|
||||||
|
/* Enable A20 gate */
|
||||||
|
call EnableA20
|
||||||
|
|
||||||
|
/* Call architecture specific initialization code */
|
||||||
|
call InitializeCpu
|
||||||
|
|
||||||
|
/* Jump to Stage2 */
|
||||||
|
call RunStage2
|
||||||
|
|
||||||
|
Clear8042:
|
||||||
|
/* Clear 8042 PS/2 buffer */
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
inb $0x64, %al
|
||||||
|
cmpb $0xff, %al
|
||||||
|
je .Clear8042_Done
|
||||||
|
testb $0x02, %al
|
||||||
|
jnz Clear8042
|
||||||
|
.Clear8042_Done:
|
||||||
|
ret
|
||||||
|
|
||||||
|
EnableA20:
|
||||||
|
/* Enable A20 gate */
|
||||||
|
pushaw
|
||||||
|
call Clear8042
|
||||||
|
movb $0xD1, %al
|
||||||
|
outb %al, $0x64
|
||||||
|
call Clear8042
|
||||||
|
movb $0xDF, %al
|
||||||
|
outb %al, $0x60
|
||||||
|
call Clear8042
|
||||||
|
movb $0xFF, %al
|
||||||
|
outb %al, $0x64
|
||||||
|
call Clear8042
|
||||||
|
popaw
|
||||||
|
ret
|
||||||
|
|
||||||
|
FindFatEntry:
|
||||||
|
/* Find a file or directory in the FAT table */
|
||||||
|
pushw %bx
|
||||||
|
pushw %cx
|
||||||
|
pushw %dx
|
||||||
|
pushw %si
|
||||||
|
pushw %di
|
||||||
|
.FindFatCluster:
|
||||||
|
/* Find FAT32 cluster holding the entry */
|
||||||
|
cmp $0x0FFFFFF8, %eax
|
||||||
|
jae .FindEntryFail
|
||||||
|
pushl %eax
|
||||||
|
movw $0x0200, %bx
|
||||||
|
movw %bx, %es
|
||||||
|
call ReadCluster
|
||||||
|
popl %eax
|
||||||
|
movb SectorsPerCluster - Start(%bp), %cl
|
||||||
|
shlw $0x04, %cx
|
||||||
|
xorw %di, %di
|
||||||
|
.FindEntryLoop:
|
||||||
|
/* Find the entry */
|
||||||
|
movb %es:(%di), %al
|
||||||
|
cmpb $0x00, %al
|
||||||
|
je .FindEntryFail
|
||||||
|
cmpb $0xE5, %al
|
||||||
|
je .FindSkipEntry
|
||||||
|
movb %es:0x0B(%di), %ah
|
||||||
|
cmpb $0x0F, %ah
|
||||||
|
je .FindSkipEntry
|
||||||
|
pushw %di
|
||||||
|
pushw %si
|
||||||
|
pushw %cx
|
||||||
|
movw $0x0B, %cx
|
||||||
|
repe cmpsb
|
||||||
|
popw %cx
|
||||||
|
popw %si
|
||||||
|
popw %di
|
||||||
|
jnz .FindSkipEntry
|
||||||
|
movw %es:0x1A(%di), %ax
|
||||||
|
movw %es:0x14(%di), %dx
|
||||||
|
shll $0x10, %edx
|
||||||
|
orl %edx, %eax
|
||||||
|
clc
|
||||||
|
jmp .FindEntryDone
|
||||||
|
.FindSkipEntry:
|
||||||
|
/* Skip to the next entry */
|
||||||
|
addw $0x20, %di
|
||||||
|
decw %cx
|
||||||
|
jnz .FindEntryLoop
|
||||||
|
call GetFatEntry
|
||||||
|
jmp .FindFatCluster
|
||||||
|
.FindEntryFail:
|
||||||
|
/* Error, file/directory not found */
|
||||||
|
stc
|
||||||
|
.FindEntryDone:
|
||||||
|
/* Clean up the stack */
|
||||||
|
popw %di
|
||||||
|
popw %si
|
||||||
|
popw %dx
|
||||||
|
popw %cx
|
||||||
|
popw %bx
|
||||||
|
ret
|
||||||
|
|
||||||
|
GetFatEntry:
|
||||||
|
/* Get FAT32 sector and offset from FAT table */
|
||||||
|
shll $0x02, %eax
|
||||||
|
movl %eax, %ecx
|
||||||
|
xorl %edx, %edx
|
||||||
|
movzwl BytesPerSector - Start(%bp), %ebx
|
||||||
|
pushl %ebx
|
||||||
|
divl %ebx
|
||||||
|
movzwl ReservedSectors - Start(%bp), %ebx
|
||||||
|
addl %ebx, %eax
|
||||||
|
movl HiddenSectors - Start(%bp), %ebx
|
||||||
|
addl %ebx, %eax
|
||||||
|
popl %ebx
|
||||||
|
decl %ebx
|
||||||
|
andl %ebx, %ecx
|
||||||
|
movzwl ExtendedFlags - Start(%bp), %ebx
|
||||||
|
andw $0x0F, %bx
|
||||||
|
jz LoadFatSector
|
||||||
|
cmpb FatCopies - Start(%bp), %bl
|
||||||
|
jae FsError
|
||||||
|
pushl %eax
|
||||||
|
movl BigSectorsPerFat - Start(%bp), %eax
|
||||||
|
mull %ebx
|
||||||
|
popl %edx
|
||||||
|
addl %edx, %eax
|
||||||
|
|
||||||
|
LoadFatSector:
|
||||||
|
/* Load FAT32 sector from disk */
|
||||||
|
pushl %ecx
|
||||||
|
movw $0x9000, %bx
|
||||||
|
movw %bx, %es
|
||||||
|
cmpl %esi, %eax
|
||||||
|
je .LoadFatSectorDone
|
||||||
|
movl %eax, %esi
|
||||||
|
xorw %bx, %bx
|
||||||
|
movw $0x01, %cx
|
||||||
|
call ReadSectors
|
||||||
|
.LoadFatSectorDone:
|
||||||
|
/* Clean up the stack */
|
||||||
|
popl %ecx
|
||||||
|
movl %es:(%ecx), %eax
|
||||||
|
andl $0x0FFFFFFF, %eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
LoadStage2:
|
||||||
|
/* Load Stage2 executable, first find file in the path */
|
||||||
|
movl $0xFFFFFFFF, %esi
|
||||||
|
pushl %esi
|
||||||
|
movl 0x7C2C, %eax
|
||||||
|
movw $.EfiDirName, %si
|
||||||
|
call FindFatEntry
|
||||||
|
jc Stage2NotLoaded
|
||||||
|
movw $.BootDirName, %si
|
||||||
|
call FindFatEntry
|
||||||
|
jc Stage2NotLoaded
|
||||||
|
movw $.Stage2FileName, %si
|
||||||
|
call FindFatEntry
|
||||||
|
jc Stage2NotLoaded
|
||||||
|
popl %esi
|
||||||
|
/* Load XTLDR file from disk */
|
||||||
|
cmpl $0x02, %eax
|
||||||
|
jb FileNotFound
|
||||||
|
cmpl $0x0FFFFFF8, %eax
|
||||||
|
jae FileNotFound
|
||||||
|
movw $(0xF800 / 16), %bx
|
||||||
|
movw %bx, %es
|
||||||
|
.LoadStage2Loop:
|
||||||
|
/* Load file data from disk */
|
||||||
|
pushl %eax
|
||||||
|
xorw %bx, %bx
|
||||||
|
pushw %es
|
||||||
|
call ReadCluster
|
||||||
|
popw %es
|
||||||
|
xorw %bx, %bx
|
||||||
|
movb SectorsPerCluster - Start(%bp), %bl
|
||||||
|
shlw $0x05, %bx
|
||||||
|
movw %es, %ax
|
||||||
|
addw %bx, %ax
|
||||||
|
movw %ax, %es
|
||||||
|
popl %eax
|
||||||
|
pushw %es
|
||||||
|
call GetFatEntry
|
||||||
|
popw %es
|
||||||
|
cmpl $0x0FFFFFF8, %eax
|
||||||
|
jb .LoadStage2Loop
|
||||||
|
ret
|
||||||
|
|
||||||
|
ParseExecutableHeader:
|
||||||
|
/* Parse Stage2 PE/COFF executable header */
|
||||||
|
pushw %es
|
||||||
|
movw $(0xF800 / 16), %ax
|
||||||
|
movw %ax, %es
|
||||||
|
movl %es:60, %eax
|
||||||
|
addl $(4 + 20), %eax
|
||||||
|
movl %es:16(%eax), %eax
|
||||||
|
addl $0xF800, %eax
|
||||||
|
popw %es
|
||||||
|
ret
|
||||||
|
|
||||||
|
ReadCluster:
|
||||||
|
/* Read FAT32 cluster from disk */
|
||||||
|
decl %eax
|
||||||
|
decl %eax
|
||||||
|
xorl %edx, %edx
|
||||||
|
movzbl SectorsPerCluster - Start(%bp), %ebx
|
||||||
|
mull %ebx
|
||||||
|
pushl %eax
|
||||||
|
xorl %edx, %edx
|
||||||
|
movzbl FatCopies - Start(%bp), %eax
|
||||||
|
mull BigSectorsPerFat - Start(%bp)
|
||||||
|
movzwl ReservedSectors - Start(%bp), %ebx
|
||||||
|
addl %ebx, %eax
|
||||||
|
addl HiddenSectors - Start(%bp), %eax
|
||||||
|
popl %ebx
|
||||||
|
addl %ebx, %eax
|
||||||
|
xorw %bx, %bx
|
||||||
|
movzbw SectorsPerCluster - Start(%bp), %cx
|
||||||
|
call ReadSectors
|
||||||
|
ret
|
||||||
|
|
||||||
|
/* Include architecture specific code */
|
||||||
|
.include ARCH_ESP_SOURCE
|
||||||
|
|
||||||
|
CpuUnsupported:
|
||||||
|
/* Display CPU unsupported message and reboot */
|
||||||
|
popal
|
||||||
|
movw $.MsgCpuUnsupported, %si
|
||||||
|
call Print
|
||||||
|
jmp Reboot
|
||||||
|
|
||||||
|
FileNotFound:
|
||||||
|
/* Display XTLDR not found message and reboot */
|
||||||
|
movw $.MsgXtLdrNotFound, %si
|
||||||
|
call Print
|
||||||
|
jmp Reboot
|
||||||
|
|
||||||
|
Stage2NotLoaded:
|
||||||
|
/* Clean up the stack and display XTLDR not found message and reboot */
|
||||||
|
popl %esi
|
||||||
|
jmp FileNotFound
|
||||||
|
|
||||||
|
.BootDirName:
|
||||||
|
/* Boot directory name */
|
||||||
|
.ascii "BOOT "
|
||||||
|
|
||||||
|
.EfiDirName:
|
||||||
|
/* EFI directory name */
|
||||||
|
.ascii "EFI "
|
||||||
|
|
||||||
|
.MsgCpuUnsupported:
|
||||||
|
.ascii "CPU not supported!\r\n\0"
|
||||||
|
|
||||||
|
.MsgXtLdrNotFound:
|
||||||
|
.ascii "XTLDR Stage2 not found!\r\n\0"
|
||||||
|
|
||||||
|
/* Fill the rest of the extra VBR with zeros and add signature */
|
||||||
|
.fill (2043 - (. - Start)), 1, 0
|
||||||
|
.ascii "XTLDR"
|
||||||
124
boot/bootsect/i686/cpu.S
Normal file
124
boot/bootsect/i686/cpu.S
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
/**
|
||||||
|
* PROJECT: ExectOS
|
||||||
|
* COPYRIGHT: See COPYING.md in the top level directory
|
||||||
|
* FILE: boot/bootsect/i686/cpu.S
|
||||||
|
* DESCRIPTION: Low-level support for CPU initialization
|
||||||
|
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
BuildPageMap:
|
||||||
|
/* Generate page map for first 16MB of memory */
|
||||||
|
pushaw
|
||||||
|
pushw %es
|
||||||
|
cld
|
||||||
|
movw $(0x1000 >> 0x04), %ax
|
||||||
|
movw %ax, %es
|
||||||
|
xorw %di, %di
|
||||||
|
movl $(0x2000 | 0x03), %eax
|
||||||
|
stosl
|
||||||
|
movl $(0x3000 | 0x03), %eax
|
||||||
|
stosl
|
||||||
|
movl $(0x4000 | 0x03), %eax
|
||||||
|
stosl
|
||||||
|
movl $(0x5000 | 0x03), %eax
|
||||||
|
stosl
|
||||||
|
xorl %eax, %eax
|
||||||
|
movw $(1024 - 4), %cx
|
||||||
|
rep stosl
|
||||||
|
movl $0x00000003, %eax
|
||||||
|
movl $4, %edx
|
||||||
|
movw $(0x2000 >> 0x04), %bx
|
||||||
|
.BuildPageMapLoop:
|
||||||
|
/* Identity map 1024 pages of 4KB */
|
||||||
|
movw %bx, %es
|
||||||
|
xorw %di, %di
|
||||||
|
pushl %edx
|
||||||
|
movw $1024, %cx
|
||||||
|
.FillPageMapTable:
|
||||||
|
/* Fill the page table */
|
||||||
|
movl %eax, %es:(%di)
|
||||||
|
addl $4096, %eax
|
||||||
|
addw $0x04, %di
|
||||||
|
loop .FillPageMapTable
|
||||||
|
popl %edx
|
||||||
|
addw $(0x1000 >> 0x04), %bx
|
||||||
|
decl %edx
|
||||||
|
jnz .BuildPageMapLoop
|
||||||
|
popw %es
|
||||||
|
popaw
|
||||||
|
ret
|
||||||
|
|
||||||
|
InitializeCpu:
|
||||||
|
/* Check if CPU supports CPUID */
|
||||||
|
pushal
|
||||||
|
pushfl
|
||||||
|
popl %eax
|
||||||
|
movl %eax, %ebx
|
||||||
|
xorl $0x00200000, %eax
|
||||||
|
pushl %eax
|
||||||
|
popfl
|
||||||
|
pushfl
|
||||||
|
popl %eax
|
||||||
|
cmpl %ebx, %eax
|
||||||
|
je CpuUnsupported
|
||||||
|
popal
|
||||||
|
call LoadGdt
|
||||||
|
ret
|
||||||
|
|
||||||
|
LoadGdt:
|
||||||
|
/* Load Global Descriptor Table */
|
||||||
|
lgdt .GdtPointer
|
||||||
|
ret
|
||||||
|
|
||||||
|
RunStage2:
|
||||||
|
/* Switch to protected mode and pass control to Stage 2 */
|
||||||
|
call BuildPageMap
|
||||||
|
call ParseExecutableHeader
|
||||||
|
pushl %eax
|
||||||
|
cli
|
||||||
|
movl %cr0, %eax
|
||||||
|
orl $0x01, %eax
|
||||||
|
movl %eax, %cr0
|
||||||
|
ljmp $0x08, $.Stage2ProtectedMode
|
||||||
|
.code32
|
||||||
|
.Stage2ProtectedMode:
|
||||||
|
/* Set segments and stack, then jump to Stage 2 */
|
||||||
|
movw $0x10, %ax
|
||||||
|
movw %ax, %ds
|
||||||
|
movw %ax, %es
|
||||||
|
movw %ax, %ss
|
||||||
|
xorw %ax, %ax
|
||||||
|
movw %ax, %fs
|
||||||
|
movw %ax, %gs
|
||||||
|
popl %eax
|
||||||
|
xorl %ebx, %ebx
|
||||||
|
xorl %ecx, %ecx
|
||||||
|
xorl %edx, %edx
|
||||||
|
xorl %esi, %esi
|
||||||
|
xorl %edi, %edi
|
||||||
|
xorl %ebp, %ebp
|
||||||
|
movl $0x1000, %ebx
|
||||||
|
movl %ebx, %cr3
|
||||||
|
movl %cr0, %ebx
|
||||||
|
orl $0x80000000, %ebx
|
||||||
|
movl %ebx, %cr0
|
||||||
|
jmp *%eax
|
||||||
|
|
||||||
|
.code16
|
||||||
|
.GdtDescriptor:
|
||||||
|
/* Global Descriptor Table */
|
||||||
|
.quad 0x0000000000000000
|
||||||
|
.quad 0x00CF9A000000FFFF
|
||||||
|
.quad 0x00CF92000000FFFF
|
||||||
|
.quad 0x00009E000000FFFF
|
||||||
|
.quad 0x000092000000FFFF
|
||||||
|
|
||||||
|
.GdtPointer:
|
||||||
|
/* Pointer to Global Descriptor Table */
|
||||||
|
.word .GdtPointer - .GdtDescriptor - 1
|
||||||
|
.long .GdtDescriptor
|
||||||
|
|
||||||
|
.Stage2FileName:
|
||||||
|
/* Name of Stage 2 executable file */
|
||||||
|
.ascii "BOOTIA32EFI"
|
||||||
154
boot/bootsect/mbrboot.S
Normal file
154
boot/bootsect/mbrboot.S
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
/**
|
||||||
|
* PROJECT: ExectOS
|
||||||
|
* COPYRIGHT: See COPYING.md in the top level directory
|
||||||
|
* FILE: boot/bootsect/amd64/mbrboot.S
|
||||||
|
* DESCRIPTION: XT Boot Loader MBR boot code
|
||||||
|
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||||
|
* Aiken Harris <aiken@codingworkshop.eu.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.code16
|
||||||
|
|
||||||
|
|
||||||
|
.global Start
|
||||||
|
Start:
|
||||||
|
/* Set segments and stack */
|
||||||
|
cli
|
||||||
|
cld
|
||||||
|
xorw %ax, %ax
|
||||||
|
movw %ax, %ds
|
||||||
|
movw %ax, %es
|
||||||
|
movw %ax, %ss
|
||||||
|
movw $0x7C00, %bp
|
||||||
|
leaw -16(%bp), %sp
|
||||||
|
sti
|
||||||
|
|
||||||
|
/* Relocate MBR to 1FE0:7C00 */
|
||||||
|
movw $0x1FE0, %ax
|
||||||
|
movw %ax, %es
|
||||||
|
movw %bp, %si
|
||||||
|
movw %bp, %di
|
||||||
|
movw $256, %cx
|
||||||
|
rep movsw
|
||||||
|
|
||||||
|
/* Jump to the relocated MBR code */
|
||||||
|
jmp $0x1FE0, $RealStart
|
||||||
|
|
||||||
|
RealStart:
|
||||||
|
/* Set segments */
|
||||||
|
movw %ax, %ds
|
||||||
|
movw %ax, %es
|
||||||
|
movw %ax, %ss
|
||||||
|
|
||||||
|
/* Print welcome message */
|
||||||
|
leaw .MsgXtosBoot, %si
|
||||||
|
call Print
|
||||||
|
|
||||||
|
/* Get BIOS boot drive and partition table offset */
|
||||||
|
lea 0x1BE(%bp), %si
|
||||||
|
movb %dl, .BootDrive
|
||||||
|
xorw %cx, %cx
|
||||||
|
|
||||||
|
FindActivePartition:
|
||||||
|
/* Look for active partition */
|
||||||
|
movb (%si), %al
|
||||||
|
cmpb $0x80, %al
|
||||||
|
je PartitionFound
|
||||||
|
addw $16, %si
|
||||||
|
incw %cx
|
||||||
|
cmpw $4, %cx
|
||||||
|
jne FindActivePartition
|
||||||
|
jmp PartitionNotFound
|
||||||
|
|
||||||
|
PartitionFound:
|
||||||
|
/* Save LBA start */
|
||||||
|
movl 8(%si), %eax
|
||||||
|
movl %eax, .LbaStart
|
||||||
|
|
||||||
|
/* Prepare Disk Address Packet (DAP) */
|
||||||
|
lea .Dap, %si
|
||||||
|
movb $0x10, 0(%si)
|
||||||
|
movb $0x00, 1(%si)
|
||||||
|
movw $1, 2(%si)
|
||||||
|
movw $0x7C00, 4(%si)
|
||||||
|
movw $0x0000, 6(%si)
|
||||||
|
movl .LbaStart, %eax
|
||||||
|
movl %eax, 8(%si)
|
||||||
|
|
||||||
|
/* Read Volume Boot Record (VBR) */
|
||||||
|
movb $0x42, %ah
|
||||||
|
movb .BootDrive, %dl
|
||||||
|
int $0x13
|
||||||
|
jc VbrReadFail
|
||||||
|
|
||||||
|
/* Verify VBR signature */
|
||||||
|
cmpw $0xAA55, (0x7C00 + 0x01FE)
|
||||||
|
jne InvalidSignature
|
||||||
|
|
||||||
|
/* Jump to the VBR code */
|
||||||
|
jmp $0x0000, $0x7C00
|
||||||
|
|
||||||
|
InvalidSignature:
|
||||||
|
/* Invalid signature error */
|
||||||
|
leaw .MsgInvalidSignature, %si
|
||||||
|
call Print
|
||||||
|
jmp HaltSystem
|
||||||
|
|
||||||
|
PartitionNotFound:
|
||||||
|
/* Active partition not found error */
|
||||||
|
leaw .MsgPartitionNotFound, %si
|
||||||
|
call Print
|
||||||
|
jmp HaltSystem
|
||||||
|
|
||||||
|
VbrReadFail:
|
||||||
|
/* VBR read failed error */
|
||||||
|
leaw .MsgVbrReadFail, %si
|
||||||
|
call Print
|
||||||
|
jmp HaltSystem
|
||||||
|
|
||||||
|
HaltSystem:
|
||||||
|
/* Disable interrupts and stop the CPU */
|
||||||
|
cli
|
||||||
|
hlt
|
||||||
|
jmp HaltSystem
|
||||||
|
|
||||||
|
Print:
|
||||||
|
/* Simple routine to print messages */
|
||||||
|
lodsb
|
||||||
|
orb %al, %al
|
||||||
|
jz DonePrint
|
||||||
|
movb $0x0E, %ah
|
||||||
|
movw $0x07, %bx
|
||||||
|
int $0x10
|
||||||
|
jmp Print
|
||||||
|
DonePrint:
|
||||||
|
retw
|
||||||
|
|
||||||
|
.BootDrive:
|
||||||
|
/* Storage for the boot drive number */
|
||||||
|
.byte 0
|
||||||
|
|
||||||
|
.Dap:
|
||||||
|
/* Storage for the Disk Address Packet (DAP) */
|
||||||
|
.fill 16, 1, 0
|
||||||
|
|
||||||
|
.LbaStart:
|
||||||
|
/* Storage for the LBA start */
|
||||||
|
.long 0
|
||||||
|
|
||||||
|
.MsgInvalidSignature:
|
||||||
|
.asciz "Invalid partition signature!"
|
||||||
|
|
||||||
|
.MsgPartitionNotFound:
|
||||||
|
.asciz "Bootable partition not found!"
|
||||||
|
|
||||||
|
.MsgVbrReadFail:
|
||||||
|
.asciz "VBR read failed!"
|
||||||
|
|
||||||
|
.MsgXtosBoot:
|
||||||
|
.asciz "Starting XTOS boot loader...\r\n"
|
||||||
|
|
||||||
|
/* Fill the rest of the MBR with zeros and add MBR signature at the end */
|
||||||
|
.fill (510 - (. - Start)), 1, 0
|
||||||
|
.word 0xAA55
|
||||||
@@ -16,6 +16,7 @@ list(APPEND LIBXTLDR_SOURCE
|
|||||||
# Specify list of source code files
|
# Specify list of source code files
|
||||||
list(APPEND XTLDR_SOURCE
|
list(APPEND XTLDR_SOURCE
|
||||||
${XTLDR_SOURCE_DIR}/arch/${ARCH}/memory.cc
|
${XTLDR_SOURCE_DIR}/arch/${ARCH}/memory.cc
|
||||||
|
${XTLDR_SOURCE_DIR}/biosutil.cc
|
||||||
${XTLDR_SOURCE_DIR}/bootutil.cc
|
${XTLDR_SOURCE_DIR}/bootutil.cc
|
||||||
${XTLDR_SOURCE_DIR}/config.cc
|
${XTLDR_SOURCE_DIR}/config.cc
|
||||||
${XTLDR_SOURCE_DIR}/console.cc
|
${XTLDR_SOURCE_DIR}/console.cc
|
||||||
@@ -38,6 +39,9 @@ add_executable(xtldr ${XTLDR_SOURCE})
|
|||||||
# Add linker libraries
|
# Add linker libraries
|
||||||
target_link_libraries(xtldr libxtos)
|
target_link_libraries(xtldr libxtos)
|
||||||
|
|
||||||
|
# Add linker options
|
||||||
|
target_link_options(xtldr PRIVATE /ALIGN:512)
|
||||||
|
|
||||||
# Set proper binary name and install target
|
# Set proper binary name and install target
|
||||||
if(ARCH STREQUAL "i686")
|
if(ARCH STREQUAL "i686")
|
||||||
set(BINARY_NAME "bootia32")
|
set(BINARY_NAME "bootia32")
|
||||||
@@ -49,5 +53,6 @@ set_install_target(xtldr efi/boot)
|
|||||||
|
|
||||||
# Set loader entrypoint and subsystem
|
# Set loader entrypoint and subsystem
|
||||||
set_entrypoint(xtldr "BlStartXtLoader")
|
set_entrypoint(xtldr "BlStartXtLoader")
|
||||||
|
set_imagebase(xtldr ${BASEADDRESS_XTLDR})
|
||||||
set_linker_map(xtldr TRUE)
|
set_linker_map(xtldr TRUE)
|
||||||
set_subsystem(xtldr efi_application)
|
set_subsystem(xtldr efi_application)
|
||||||
@@ -28,13 +28,12 @@ EFI_STATUS
|
|||||||
Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN ULONG_PTR SelfMapAddress)
|
IN ULONG_PTR SelfMapAddress)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY ListEntry, ModulesList, ModulesListEntry;
|
PLIST_ENTRY ModulesList, ModulesListEntry;
|
||||||
PXTBL_MEMORY_MAPPING Mapping;
|
|
||||||
PXTBL_MODULE_INFO ModuleInfo;
|
PXTBL_MODULE_INFO ModuleInfo;
|
||||||
EFI_PHYSICAL_ADDRESS Address;
|
EFI_PHYSICAL_ADDRESS Address;
|
||||||
PVOID LoaderBase;
|
|
||||||
ULONGLONG LoaderSize;
|
ULONGLONG LoaderSize;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
PVOID LoaderBase;
|
||||||
|
|
||||||
/* Allocate pages for the Page Map */
|
/* Allocate pages for the Page Map */
|
||||||
Status = AllocatePages(AllocateAnyPages, 1, &Address);
|
Status = AllocatePages(AllocateAnyPages, 1, &Address);
|
||||||
@@ -44,6 +43,14 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add new memory mapping for the page map itself */
|
||||||
|
Status = MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Memory mapping failure */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* Assign and zero-fill memory used by page mappings */
|
/* Assign and zero-fill memory used by page mappings */
|
||||||
PageMap->PtePointer = (PVOID)(UINT_PTR)Address;
|
PageMap->PtePointer = (PVOID)(UINT_PTR)Address;
|
||||||
RTL::Memory::ZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE);
|
RTL::Memory::ZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE);
|
||||||
@@ -57,7 +64,7 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Map the trampoline code area */
|
/* Map the trampoline code area */
|
||||||
Status = MapVirtualMemory(PageMap, (PVOID)MM_TRAMPOLINE_ADDRESS,(PVOID)MM_TRAMPOLINE_ADDRESS,
|
Status = MapVirtualMemory(PageMap, MM_TRAMPOLINE_ADDRESS, MM_TRAMPOLINE_ADDRESS,
|
||||||
1, LoaderFirmwareTemporary);
|
1, LoaderFirmwareTemporary);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
@@ -74,7 +81,7 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
ModuleInfo = CONTAIN_RECORD(ModulesListEntry, XTBL_MODULE_INFO, Flink);
|
ModuleInfo = CONTAIN_RECORD(ModulesListEntry, XTBL_MODULE_INFO, Flink);
|
||||||
|
|
||||||
/* Map module code */
|
/* Map module code */
|
||||||
Status = MapVirtualMemory(PageMap, ModuleInfo->ModuleBase, ModuleInfo->ModuleBase,
|
Status = MapVirtualMemory(PageMap, (ULONGLONG)ModuleInfo->ModuleBase, (ULONGLONG)ModuleInfo->ModuleBase,
|
||||||
EFI_SIZE_TO_PAGES(ModuleInfo->ModuleSize), LoaderFirmwareTemporary);
|
EFI_SIZE_TO_PAGES(ModuleInfo->ModuleSize), LoaderFirmwareTemporary);
|
||||||
|
|
||||||
/* Check if mapping succeeded */
|
/* Check if mapping succeeded */
|
||||||
@@ -95,7 +102,7 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
if(LoaderBase && LoaderSize)
|
if(LoaderBase && LoaderSize)
|
||||||
{
|
{
|
||||||
/* Map boot loader code as well */
|
/* Map boot loader code as well */
|
||||||
Status = MapVirtualMemory(PageMap, LoaderBase, LoaderBase,
|
Status = MapVirtualMemory(PageMap, (ULONGLONG)LoaderBase, (ULONGLONG)LoaderBase,
|
||||||
EFI_SIZE_TO_PAGES(LoaderSize), LoaderFirmwareTemporary);
|
EFI_SIZE_TO_PAGES(LoaderSize), LoaderFirmwareTemporary);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
@@ -109,6 +116,28 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
return STATUS_EFI_PROTOCOL_ERROR;
|
return STATUS_EFI_PROTOCOL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return success */
|
||||||
|
return STATUS_EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterates through the memory map and physically maps all virtual addresses to page tables.
|
||||||
|
*
|
||||||
|
* @param PageMap
|
||||||
|
* Supplies a pointer to the page mapping structure.
|
||||||
|
*
|
||||||
|
* @return This routine returns a status code.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
EFI_STATUS
|
||||||
|
Memory::CommitPageMap(IN PXTBL_PAGE_MAPPING PageMap)
|
||||||
|
{
|
||||||
|
PXTBL_MEMORY_MAPPING Mapping;
|
||||||
|
PLIST_ENTRY ListEntry;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
/* Iterate through and map all the mappings*/
|
/* Iterate through and map all the mappings*/
|
||||||
Debug::Print(L"Mapping and dumping EFI memory:\n");
|
Debug::Print(L"Mapping and dumping EFI memory:\n");
|
||||||
ListEntry = PageMap->MemoryMap.Flink;
|
ListEntry = PageMap->MemoryMap.Flink;
|
||||||
@@ -193,7 +222,7 @@ Memory::GetNextPageTable(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Add new memory mapping */
|
/* Add new memory mapping */
|
||||||
Status = MapVirtualMemory(PageMap, NULLPTR, (PVOID)(UINT_PTR)Address, 1, LoaderMemoryData);
|
Status = MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Memory mapping failure */
|
/* Memory mapping failure */
|
||||||
@@ -239,9 +268,9 @@ Memory::GetNextPageTable(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Memory::MapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
Memory::MapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN ULONG_PTR VirtualAddress,
|
IN ULONGLONG VirtualAddress,
|
||||||
IN ULONG_PTR PhysicalAddress,
|
IN ULONGLONG PhysicalAddress,
|
||||||
IN ULONG NumberOfPages)
|
IN ULONGLONG NumberOfPages)
|
||||||
{
|
{
|
||||||
PVOID Pml1, Pml2, Pml3, Pml4, Pml5;
|
PVOID Pml1, Pml2, Pml3, Pml4, Pml5;
|
||||||
SIZE_T Pml1Entry, Pml2Entry, Pml3Entry, Pml4Entry, Pml5Entry;
|
SIZE_T Pml1Entry, Pml2Entry, Pml3Entry, Pml4Entry, Pml5Entry;
|
||||||
@@ -25,13 +25,12 @@ EFI_STATUS
|
|||||||
Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN ULONG_PTR SelfMapAddress)
|
IN ULONG_PTR SelfMapAddress)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY ListEntry, ModulesList, ModulesListEntry;
|
|
||||||
EFI_PHYSICAL_ADDRESS Address, DirectoryAddress;
|
EFI_PHYSICAL_ADDRESS Address, DirectoryAddress;
|
||||||
|
PLIST_ENTRY ModulesList, ModulesListEntry;
|
||||||
PXTBL_MODULE_INFO ModuleInfo;
|
PXTBL_MODULE_INFO ModuleInfo;
|
||||||
PXTBL_MEMORY_MAPPING Mapping;
|
|
||||||
PVOID LoaderBase;
|
|
||||||
ULONGLONG LoaderSize;
|
ULONGLONG LoaderSize;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
PVOID LoaderBase;
|
||||||
ULONG Index;
|
ULONG Index;
|
||||||
|
|
||||||
/* Check the page map level to determine which paging structure to create */
|
/* Check the page map level to determine which paging structure to create */
|
||||||
@@ -45,6 +44,14 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add new memory mapping for the page map itself */
|
||||||
|
Status = MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Memory mapping failure */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* Assign the allocated page to the page map and zero it out */
|
/* Assign the allocated page to the page map and zero it out */
|
||||||
PageMap->PtePointer = (PVOID)(UINT_PTR)Address;
|
PageMap->PtePointer = (PVOID)(UINT_PTR)Address;
|
||||||
RTL::Memory::ZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE);
|
RTL::Memory::ZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE);
|
||||||
@@ -57,6 +64,14 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add new memory mapping for the Page Directories (PDs) */
|
||||||
|
Status = MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, DirectoryAddress, 4, LoaderMemoryData);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Memory mapping failure */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* Zero-fill the allocated memory for the Page Directories */
|
/* Zero-fill the allocated memory for the Page Directories */
|
||||||
RTL::Memory::ZeroMemory((PVOID)DirectoryAddress, EFI_PAGE_SIZE * 4);
|
RTL::Memory::ZeroMemory((PVOID)DirectoryAddress, EFI_PAGE_SIZE * 4);
|
||||||
|
|
||||||
@@ -79,6 +94,14 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add new memory mapping for the page map itself */
|
||||||
|
Status = MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Memory mapping failure */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* Assign the allocated page to the page map and zero it out */
|
/* Assign the allocated page to the page map and zero it out */
|
||||||
PageMap->PtePointer = (PVOID)(UINT_PTR)Address;
|
PageMap->PtePointer = (PVOID)(UINT_PTR)Address;
|
||||||
RTL::Memory::ZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE);
|
RTL::Memory::ZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE);
|
||||||
@@ -93,8 +116,7 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Map the trampoline code area */
|
/* Map the trampoline code area */
|
||||||
Status = MapVirtualMemory(PageMap, (PVOID)MM_TRAMPOLINE_ADDRESS,(PVOID)MM_TRAMPOLINE_ADDRESS,
|
Status = MapVirtualMemory(PageMap, MM_TRAMPOLINE_ADDRESS, MM_TRAMPOLINE_ADDRESS, 1, LoaderFirmwareTemporary);
|
||||||
1, LoaderFirmwareTemporary);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Mapping trampoline code failed */
|
/* Mapping trampoline code failed */
|
||||||
@@ -110,7 +132,7 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
ModuleInfo = CONTAIN_RECORD(ModulesListEntry, XTBL_MODULE_INFO, Flink);
|
ModuleInfo = CONTAIN_RECORD(ModulesListEntry, XTBL_MODULE_INFO, Flink);
|
||||||
|
|
||||||
/* Map module code */
|
/* Map module code */
|
||||||
Status = MapVirtualMemory(PageMap, ModuleInfo->ModuleBase, ModuleInfo->ModuleBase,
|
Status = MapVirtualMemory(PageMap, (ULONGLONG)ModuleInfo->ModuleBase, (ULONGLONG)ModuleInfo->ModuleBase,
|
||||||
EFI_SIZE_TO_PAGES(ModuleInfo->ModuleSize), LoaderFirmwareTemporary);
|
EFI_SIZE_TO_PAGES(ModuleInfo->ModuleSize), LoaderFirmwareTemporary);
|
||||||
|
|
||||||
/* Check if mapping succeeded */
|
/* Check if mapping succeeded */
|
||||||
@@ -131,7 +153,7 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
if(LoaderBase && LoaderSize)
|
if(LoaderBase && LoaderSize)
|
||||||
{
|
{
|
||||||
/* Map boot loader code as well */
|
/* Map boot loader code as well */
|
||||||
Status = MapVirtualMemory(PageMap, LoaderBase, LoaderBase,
|
Status = MapVirtualMemory(PageMap, (ULONGLONG)LoaderBase, (ULONGLONG)LoaderBase,
|
||||||
EFI_SIZE_TO_PAGES(LoaderSize), LoaderFirmwareTemporary);
|
EFI_SIZE_TO_PAGES(LoaderSize), LoaderFirmwareTemporary);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
@@ -145,6 +167,28 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
return STATUS_EFI_PROTOCOL_ERROR;
|
return STATUS_EFI_PROTOCOL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return success */
|
||||||
|
return STATUS_EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterates through the memory map and physically maps all virtual addresses to page tables.
|
||||||
|
*
|
||||||
|
* @param PageMap
|
||||||
|
* Supplies a pointer to the page mapping structure.
|
||||||
|
*
|
||||||
|
* @return This routine returns a status code.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
EFI_STATUS
|
||||||
|
Memory::CommitPageMap(IN PXTBL_PAGE_MAPPING PageMap)
|
||||||
|
{
|
||||||
|
PXTBL_MEMORY_MAPPING Mapping;
|
||||||
|
PLIST_ENTRY ListEntry;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
/* Iterate through and map all the mappings*/
|
/* Iterate through and map all the mappings*/
|
||||||
Debug::Print(L"Mapping and dumping EFI memory:\n");
|
Debug::Print(L"Mapping and dumping EFI memory:\n");
|
||||||
ListEntry = PageMap->MemoryMap.Flink;
|
ListEntry = PageMap->MemoryMap.Flink;
|
||||||
@@ -157,8 +201,9 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
if(Mapping->VirtualAddress)
|
if(Mapping->VirtualAddress)
|
||||||
{
|
{
|
||||||
/* Dump memory mapping */
|
/* Dump memory mapping */
|
||||||
Debug::Print(L" Type=%02lu, PhysicalBase=%.8P, VirtualBase=%.8P, Pages=%llu\n", Mapping->MemoryType,
|
Debug::Print(L" Type=%02lu, PhysicalBase=0x%.8llX, VirtualBase=0x%.8llX, Pages=%llu\n",
|
||||||
Mapping->PhysicalAddress, Mapping->VirtualAddress, Mapping->NumberOfPages);
|
Mapping->MemoryType, Mapping->PhysicalAddress,
|
||||||
|
Mapping->VirtualAddress, Mapping->NumberOfPages);
|
||||||
|
|
||||||
/* Map memory */
|
/* Map memory */
|
||||||
Status = MapPage(PageMap, (UINT_PTR)Mapping->VirtualAddress,
|
Status = MapPage(PageMap, (UINT_PTR)Mapping->VirtualAddress,
|
||||||
@@ -252,7 +297,7 @@ Memory::GetNextPageTable(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Add new memory mapping */
|
/* Add new memory mapping */
|
||||||
Status = MapVirtualMemory(PageMap, NULLPTR, (PVOID)(UINT_PTR)Address, 1, LoaderMemoryData);
|
Status = MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Memory mapping failure */
|
/* Memory mapping failure */
|
||||||
@@ -313,11 +358,11 @@ Memory::GetNextPageTable(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Memory::MapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
Memory::MapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN ULONG_PTR VirtualAddress,
|
IN ULONGLONG VirtualAddress,
|
||||||
IN ULONG_PTR PhysicalAddress,
|
IN ULONGLONG PhysicalAddress,
|
||||||
IN ULONG NumberOfPages)
|
IN ULONGLONG NumberOfPages)
|
||||||
{
|
{
|
||||||
SIZE_T PageFrameNumber;
|
ULONGLONG PageFrameNumber;
|
||||||
PVOID Pml1, Pml2, Pml3;
|
PVOID Pml1, Pml2, Pml3;
|
||||||
SIZE_T Pml1Entry, Pml2Entry, Pml3Entry;
|
SIZE_T Pml1Entry, Pml2Entry, Pml3Entry;
|
||||||
PHARDWARE_LEGACY_PTE LegacyPmlTable;
|
PHARDWARE_LEGACY_PTE LegacyPmlTable;
|
||||||
190
boot/xtldr/biosutil.cc
Normal file
190
boot/xtldr/biosutil.cc
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
/**
|
||||||
|
* PROJECT: ExectOS
|
||||||
|
* COPYRIGHT: See COPYING.md in the top level directory
|
||||||
|
* FILE: xtldr/biosutil.cc
|
||||||
|
* DESCRIPTION: Legacy BIOS support
|
||||||
|
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xtldr.hh>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the entire screen and moves the cursor to the top-left corner.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
BiosUtils::ClearScreen()
|
||||||
|
{
|
||||||
|
VOLATILE PUSHORT VgaBuffer = (PUSHORT)0xB8000;
|
||||||
|
USHORT Blank;
|
||||||
|
UINT Index;
|
||||||
|
|
||||||
|
/* Set blank character */
|
||||||
|
Blank = (0x0F << 8) | L' ';
|
||||||
|
|
||||||
|
/* Fill the entire screen with blank characters */
|
||||||
|
for(Index = 0; Index < VgaWidth * VgaHeight; Index++)
|
||||||
|
{
|
||||||
|
VgaBuffer[Index] = Blank;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reset cursor position to the top-left corner */
|
||||||
|
CursorX = 0;
|
||||||
|
CursorY = 0;
|
||||||
|
|
||||||
|
/* Update the hardware cursor position */
|
||||||
|
UpdateCursor();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats the input string and prints it out to the screen.
|
||||||
|
*
|
||||||
|
* @param Format
|
||||||
|
* The formatted string that is to be written to the output.
|
||||||
|
*
|
||||||
|
* @param ...
|
||||||
|
* Depending on the format string, this routine might expect a sequence of additional arguments.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
BiosUtils::Print(IN PCWSTR Format,
|
||||||
|
IN ...)
|
||||||
|
{
|
||||||
|
RTL_PRINT_CONTEXT PrintContext;
|
||||||
|
VA_LIST Arguments;
|
||||||
|
|
||||||
|
/* Initialise the print contexts */
|
||||||
|
PrintContext.WriteWideCharacter = PutChar;
|
||||||
|
|
||||||
|
/* Initialise the va_list */
|
||||||
|
VA_START(Arguments, Format);
|
||||||
|
|
||||||
|
/* Format and print the string to the stdout */
|
||||||
|
RTL::WideString::FormatWideString(&PrintContext, (PWCHAR)Format, Arguments);
|
||||||
|
|
||||||
|
/* Clean up the va_list */
|
||||||
|
VA_END(Arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a single wide character to the screen using legacy BIOS VGA text mode.
|
||||||
|
*
|
||||||
|
* @param Character
|
||||||
|
* The wide character to be printed.
|
||||||
|
*
|
||||||
|
* @return This routine returns a status code.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
XTSTATUS
|
||||||
|
BiosUtils::PutChar(IN WCHAR Character)
|
||||||
|
{
|
||||||
|
VOLATILE PUSHORT VgaBuffer = (PUSHORT)0xB8000;
|
||||||
|
USHORT VgaCharacter;
|
||||||
|
|
||||||
|
/* Handle special characters */
|
||||||
|
if(Character == L'\n')
|
||||||
|
{
|
||||||
|
/* Move to the next line */
|
||||||
|
CursorX = 0;
|
||||||
|
CursorY++;
|
||||||
|
}
|
||||||
|
else if(Character == L'\r')
|
||||||
|
{
|
||||||
|
/* Move to the beginning of the current line */
|
||||||
|
CursorX = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Print character and move cursor to the right */
|
||||||
|
VgaCharacter = (0x0F << 8) | (Character & 0xFF);
|
||||||
|
VgaBuffer[CursorY * VgaWidth + CursorX] = VgaCharacter;
|
||||||
|
CursorX++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle moving to the next line if cursor is at the end of the line */
|
||||||
|
if(CursorX >= VgaWidth)
|
||||||
|
{
|
||||||
|
CursorX = 0;
|
||||||
|
CursorY++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle scrolling if cursor is at the end of the screen */
|
||||||
|
if(CursorY >= VgaHeight)
|
||||||
|
{
|
||||||
|
ScrollScreen();
|
||||||
|
CursorY = VgaHeight - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update the hardware cursor position */
|
||||||
|
UpdateCursor();
|
||||||
|
|
||||||
|
/* Return success */
|
||||||
|
return STATUS_EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scrolls the entire screen content up by one line and clears the last line.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
BiosUtils::ScrollScreen()
|
||||||
|
{
|
||||||
|
VOLATILE PUSHORT VgaBuffer = (PUSHORT)0xB8000;
|
||||||
|
USHORT Blank;
|
||||||
|
UINT Index;
|
||||||
|
|
||||||
|
/* Set blank character */
|
||||||
|
Blank = (0x0F << 8) | L' ';
|
||||||
|
|
||||||
|
/* Move every line up by one */
|
||||||
|
for(Index = 0; Index < (VgaHeight - 1) * VgaWidth; Index++)
|
||||||
|
{
|
||||||
|
VgaBuffer[Index] = VgaBuffer[Index + VgaWidth];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear the last line */
|
||||||
|
for(Index = (VgaHeight - 1) * VgaWidth; Index < VgaHeight * VgaWidth; Index++)
|
||||||
|
{
|
||||||
|
VgaBuffer[Index] = Blank;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the hardware cursor position on the screen.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
BiosUtils::UpdateCursor()
|
||||||
|
{
|
||||||
|
USHORT Position;
|
||||||
|
|
||||||
|
/* Calculate cursor position */
|
||||||
|
Position = CursorY * VgaWidth + CursorX;
|
||||||
|
|
||||||
|
/* Send command to set the high byte of the cursor position */
|
||||||
|
HL::IoPort::WritePort8(0x3D4, 0x0E);
|
||||||
|
HL::IoPort::WritePort8(0x3D5, (UCHAR)((Position >> 8) & 0xFF));
|
||||||
|
|
||||||
|
/* Send command to set the low byte of the cursor position */
|
||||||
|
HL::IoPort::WritePort8(0x3D4, 0x0F);
|
||||||
|
HL::IoPort::WritePort8(0x3D5, (UCHAR)(Position & 0xFF));
|
||||||
|
}
|
||||||
@@ -362,6 +362,13 @@ Configuration::InitializeBootMenuList(IN ULONG MaxNameLength,
|
|||||||
return STATUS_EFI_SUCCESS;
|
return STATUS_EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the XTLDR configuration subsystem.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
XTCDECL
|
XTCDECL
|
||||||
VOID
|
VOID
|
||||||
Configuration::InitializeConfiguration()
|
Configuration::InitializeConfiguration()
|
||||||
@@ -615,7 +622,7 @@ Configuration::ParseConfigFile(IN CONST PCHAR RawConfig,
|
|||||||
SectionName = InputData;
|
SectionName = InputData;
|
||||||
|
|
||||||
/* Find end of the section name */
|
/* Find end of the section name */
|
||||||
while(*InputData != ']' && *InputData != '\0' && *InputData != '\n')
|
while(*InputData != ']' && *InputData != '\0' && *InputData != '\r' && *InputData != '\n')
|
||||||
{
|
{
|
||||||
/* Advance to the next character */
|
/* Advance to the next character */
|
||||||
InputData++;
|
InputData++;
|
||||||
@@ -665,7 +672,7 @@ Configuration::ParseConfigFile(IN CONST PCHAR RawConfig,
|
|||||||
Key = InputData;
|
Key = InputData;
|
||||||
|
|
||||||
/* Find end of the key */
|
/* Find end of the key */
|
||||||
while(*InputData != '=' && *InputData != '\0' && *InputData != '\n')
|
while(*InputData != '=' && *InputData != '\0' && *InputData != '\r' && *InputData != '\n')
|
||||||
{
|
{
|
||||||
/* Advance to the next character */
|
/* Advance to the next character */
|
||||||
InputData++;
|
InputData++;
|
||||||
@@ -693,7 +700,7 @@ Configuration::ParseConfigFile(IN CONST PCHAR RawConfig,
|
|||||||
Value = InputData;
|
Value = InputData;
|
||||||
|
|
||||||
/* Find end of the value */
|
/* Find end of the value */
|
||||||
while(*InputData != '\0' && *InputData != '\n')
|
while(*InputData != '\0' && *InputData != '\r' && *InputData != '\n')
|
||||||
{
|
{
|
||||||
/* Advance to the next character */
|
/* Advance to the next character */
|
||||||
InputData++;
|
InputData++;
|
||||||
@@ -10,6 +10,18 @@
|
|||||||
#include <xtldr.hh>
|
#include <xtldr.hh>
|
||||||
|
|
||||||
|
|
||||||
|
/* Legacy BIOS cursor X position */
|
||||||
|
USHORT BiosUtils::CursorX = 0;
|
||||||
|
|
||||||
|
/* Legacy BIOS cursor Y position */
|
||||||
|
USHORT BiosUtils::CursorY = 0;
|
||||||
|
|
||||||
|
/* Legacy BIOS screen height */
|
||||||
|
CONST USHORT BiosUtils::VgaHeight = 25;
|
||||||
|
|
||||||
|
/* Legacy BIOS screen width */
|
||||||
|
CONST USHORT BiosUtils::VgaWidth = 80;
|
||||||
|
|
||||||
/* XT Boot Loader menu list */
|
/* XT Boot Loader menu list */
|
||||||
PLIST_ENTRY Configuration::BootMenuList = NULLPTR;
|
PLIST_ENTRY Configuration::BootMenuList = NULLPTR;
|
||||||
|
|
||||||
@@ -387,9 +387,16 @@ Debug::PutChar(IN WCHAR Character)
|
|||||||
return HL::ComPort::WriteComPort(&SerialPort, Buffer[0]);
|
return HL::ComPort::WriteComPort(&SerialPort, Buffer[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if the serial port has been successfully initialized and is ready for communication.
|
||||||
|
*
|
||||||
|
* @return This routine returns TRUE if the serial port is initialized and ready, FALSE otherwise.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
XTCDECL
|
XTCDECL
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
Debug::SerialPortReady()
|
Debug::SerialPortReady()
|
||||||
{
|
{
|
||||||
return (BOOLEAN)(SerialPort.Flags & COMPORT_FLAG_INIT);
|
return (SerialPort.Flags & COMPORT_FLAG_INIT);
|
||||||
}
|
}
|
||||||
@@ -13,9 +13,27 @@
|
|||||||
#include <xtver.h>
|
#include <xtver.h>
|
||||||
|
|
||||||
#include <libxtos.hh>
|
#include <libxtos.hh>
|
||||||
#include <globals.hh>
|
|
||||||
|
|
||||||
|
|
||||||
|
class BiosUtils
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
STATIC USHORT CursorX;
|
||||||
|
STATIC USHORT CursorY;
|
||||||
|
STATIC CONST USHORT VgaHeight;
|
||||||
|
STATIC CONST USHORT VgaWidth;
|
||||||
|
|
||||||
|
public:
|
||||||
|
STATIC XTCDECL VOID ClearScreen();
|
||||||
|
STATIC XTCDECL VOID Print(IN PCWSTR Format,
|
||||||
|
IN ...);
|
||||||
|
STATIC XTCDECL XTSTATUS PutChar(IN WCHAR Character);
|
||||||
|
|
||||||
|
private:
|
||||||
|
STATIC XTCDECL VOID ScrollScreen();
|
||||||
|
STATIC XTCDECL VOID UpdateCursor();
|
||||||
|
};
|
||||||
|
|
||||||
class BootUtils
|
class BootUtils
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -147,6 +165,7 @@ class Memory
|
|||||||
OUT PVOID *Memory);
|
OUT PVOID *Memory);
|
||||||
STATIC XTCDECL EFI_STATUS BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
STATIC XTCDECL EFI_STATUS BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN ULONG_PTR SelfMapAddress);
|
IN ULONG_PTR SelfMapAddress);
|
||||||
|
STATIC XTCDECL EFI_STATUS CommitPageMap(IN PXTBL_PAGE_MAPPING PageMap);
|
||||||
STATIC XTCDECL EFI_STATUS FreePages(IN ULONGLONG NumberOfPages,
|
STATIC XTCDECL EFI_STATUS FreePages(IN ULONGLONG NumberOfPages,
|
||||||
IN EFI_PHYSICAL_ADDRESS Memory);
|
IN EFI_PHYSICAL_ADDRESS Memory);
|
||||||
STATIC XTCDECL EFI_STATUS FreePool(IN PVOID Memory);
|
STATIC XTCDECL EFI_STATUS FreePool(IN PVOID Memory);
|
||||||
@@ -159,15 +178,16 @@ class Memory
|
|||||||
IN SHORT PageMapLevel,
|
IN SHORT PageMapLevel,
|
||||||
IN PAGE_SIZE PageSize);
|
IN PAGE_SIZE PageSize);
|
||||||
STATIC XTCDECL EFI_STATUS MapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
STATIC XTCDECL EFI_STATUS MapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN OUT PVOID *MemoryMapAddress,
|
IN OUT PVOID *BaseAddress,
|
||||||
|
IN BOOLEAN IdentityMapping,
|
||||||
IN PBL_GET_MEMTYPE_ROUTINE GetMemoryTypeRoutine);
|
IN PBL_GET_MEMTYPE_ROUTINE GetMemoryTypeRoutine);
|
||||||
STATIC XTCDECL EFI_STATUS MapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
STATIC XTCDECL EFI_STATUS MapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN ULONG_PTR VirtualAddress,
|
IN ULONGLONG VirtualAddress,
|
||||||
IN ULONG_PTR PhysicalAddress,
|
IN ULONGLONG PhysicalAddress,
|
||||||
IN ULONG NumberOfPages);
|
IN ULONGLONG NumberOfPages);
|
||||||
STATIC XTCDECL EFI_STATUS MapVirtualMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
STATIC XTCDECL EFI_STATUS MapVirtualMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN PVOID VirtualAddress,
|
IN ULONGLONG VirtualAddress,
|
||||||
IN PVOID PhysicalAddress,
|
IN ULONGLONG PhysicalAddress,
|
||||||
IN ULONGLONG NumberOfPages,
|
IN ULONGLONG NumberOfPages,
|
||||||
IN LOADER_MEMORY_TYPE MemoryType);
|
IN LOADER_MEMORY_TYPE MemoryType);
|
||||||
STATIC XTCDECL PVOID PhysicalAddressToVirtual(IN PVOID PhysicalAddress,
|
STATIC XTCDECL PVOID PhysicalAddressToVirtual(IN PVOID PhysicalAddress,
|
||||||
@@ -314,9 +314,12 @@ Memory::InitializePageMap(OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
* @param PageMap
|
* @param PageMap
|
||||||
* Supplies a pointer to the page mapping structure.
|
* Supplies a pointer to the page mapping structure.
|
||||||
*
|
*
|
||||||
* @param MemoryMapAddress
|
* @param BaseAddress
|
||||||
* Supplies a virtual address, where EFI memory will be mapped.
|
* Supplies a virtual address, where EFI memory will be mapped.
|
||||||
*
|
*
|
||||||
|
* @param IdentityMapping
|
||||||
|
* Specifies whether EFI non-free memory should be mapped by identity or sequential mapping.
|
||||||
|
*
|
||||||
* @param GetMemoryTypeRoutine
|
* @param GetMemoryTypeRoutine
|
||||||
* Supplies a pointer to the routine which will be used to match EFI memory type to the OS memory type.
|
* Supplies a pointer to the routine which will be used to match EFI memory type to the OS memory type.
|
||||||
*
|
*
|
||||||
@@ -327,19 +330,20 @@ Memory::InitializePageMap(OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Memory::MapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
Memory::MapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN OUT PVOID *MemoryMapAddress,
|
IN OUT PVOID *BaseAddress,
|
||||||
|
IN BOOLEAN IdentityMapping,
|
||||||
IN PBL_GET_MEMTYPE_ROUTINE GetMemoryTypeRoutine)
|
IN PBL_GET_MEMTYPE_ROUTINE GetMemoryTypeRoutine)
|
||||||
{
|
{
|
||||||
|
ULONGLONG MaxAddress, VirtualAddress;
|
||||||
PEFI_MEMORY_DESCRIPTOR Descriptor;
|
PEFI_MEMORY_DESCRIPTOR Descriptor;
|
||||||
LOADER_MEMORY_TYPE MemoryType;
|
LOADER_MEMORY_TYPE MemoryType;
|
||||||
PEFI_MEMORY_MAP MemoryMap;
|
PEFI_MEMORY_MAP MemoryMap;
|
||||||
SIZE_T DescriptorCount;
|
SIZE_T DescriptorCount;
|
||||||
PUCHAR VirtualAddress;
|
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
SIZE_T Index;
|
SIZE_T Index;
|
||||||
|
|
||||||
/* Set virtual address as specified in argument */
|
/* Set virtual address as specified in argument */
|
||||||
VirtualAddress = (PUCHAR)*MemoryMapAddress;
|
VirtualAddress = (ULONGLONG)*BaseAddress;
|
||||||
|
|
||||||
/* Check if custom memory type routine is specified */
|
/* Check if custom memory type routine is specified */
|
||||||
if(GetMemoryTypeRoutine == NULLPTR)
|
if(GetMemoryTypeRoutine == NULLPTR)
|
||||||
@@ -367,8 +371,37 @@ Memory::MapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
/* Iterate through all descriptors from the memory map */
|
/* Iterate through all descriptors from the memory map */
|
||||||
for(Index = 0; Index < DescriptorCount; Index++)
|
for(Index = 0; Index < DescriptorCount; Index++)
|
||||||
{
|
{
|
||||||
/* Make sure descriptor does not start beyond lowest physical page */
|
/* Check page map level */
|
||||||
if(Descriptor->PhysicalStart <= MAXUINT_PTR)
|
if(PageMap->PageMapLevel == 2)
|
||||||
|
{
|
||||||
|
/* Limit physical address to 4GB in legacy mode */
|
||||||
|
MaxAddress = 0xFFFFFFFF;
|
||||||
|
}
|
||||||
|
else if(PageMap->PageMapLevel == 3)
|
||||||
|
{
|
||||||
|
/* Limit physical address to 64GB in PAE mode */
|
||||||
|
MaxAddress = 0xFFFFFFFFFULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check page map level */
|
||||||
|
if(PageMap->PageMapLevel == 2 || PageMap->PageMapLevel == 3)
|
||||||
|
{
|
||||||
|
/* Check if physical address starts beyond limit */
|
||||||
|
if(Descriptor->PhysicalStart >= MaxAddress)
|
||||||
|
{
|
||||||
|
/* Go to the next descriptor */
|
||||||
|
Descriptor = (PEFI_MEMORY_DESCRIPTOR)((PUCHAR)Descriptor + MemoryMap->DescriptorSize);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if memory descriptor exceeds the lowest physical page */
|
||||||
|
if(Descriptor->PhysicalStart + (Descriptor->NumberOfPages << EFI_PAGE_SHIFT) > MaxAddress)
|
||||||
|
{
|
||||||
|
/* Truncate memory descriptor to the lowest supported physical page */
|
||||||
|
Descriptor->NumberOfPages = (MaxAddress - Descriptor->PhysicalStart) >> EFI_PAGE_SHIFT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
/* Skip EFI reserved memory */
|
/* Skip EFI reserved memory */
|
||||||
if(Descriptor->Type == EfiReservedMemoryType)
|
if(Descriptor->Type == EfiReservedMemoryType)
|
||||||
@@ -378,25 +411,6 @@ Memory::MapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if preparing page map level 2 (non-PAE i686) */
|
|
||||||
if(PageMap->PageMapLevel == 2)
|
|
||||||
{
|
|
||||||
/* Check if physical address starts beyond 4GB */
|
|
||||||
if(Descriptor->PhysicalStart > 0xFFFFFFFF)
|
|
||||||
{
|
|
||||||
/* Go to the next descriptor */
|
|
||||||
Descriptor = (PEFI_MEMORY_DESCRIPTOR)((PUCHAR)Descriptor + MemoryMap->DescriptorSize);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if memory descriptor exceeds the lowest physical page */
|
|
||||||
if(Descriptor->PhysicalStart + (Descriptor->NumberOfPages << EFI_PAGE_SHIFT) > MAXULONG)
|
|
||||||
{
|
|
||||||
/* Truncate memory descriptor to the 4GB */
|
|
||||||
Descriptor->NumberOfPages = (((ULONGLONG)MAXULONG + 1) - Descriptor->PhysicalStart) >> EFI_PAGE_SHIFT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert EFI memory type into XTLDR memory type */
|
/* Convert EFI memory type into XTLDR memory type */
|
||||||
MemoryType = GetMemoryTypeRoutine((EFI_MEMORY_TYPE)Descriptor->Type);
|
MemoryType = GetMemoryTypeRoutine((EFI_MEMORY_TYPE)Descriptor->Type);
|
||||||
|
|
||||||
@@ -404,22 +418,32 @@ Memory::MapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
if(MemoryType == LoaderFirmwareTemporary)
|
if(MemoryType == LoaderFirmwareTemporary)
|
||||||
{
|
{
|
||||||
/* Map EFI firmware code */
|
/* Map EFI firmware code */
|
||||||
Status = MapVirtualMemory(PageMap, (PVOID)Descriptor->PhysicalStart,
|
Status = MapVirtualMemory(PageMap, Descriptor->PhysicalStart,
|
||||||
(PVOID)Descriptor->PhysicalStart, Descriptor->NumberOfPages, MemoryType);
|
Descriptor->PhysicalStart, Descriptor->NumberOfPages, MemoryType);
|
||||||
}
|
}
|
||||||
else if(MemoryType != LoaderFree)
|
else if(MemoryType != LoaderFree)
|
||||||
{
|
{
|
||||||
/* Add any non-free memory mapping */
|
/* Check mapping strategy */
|
||||||
Status = MapVirtualMemory(PageMap, VirtualAddress, (PVOID)Descriptor->PhysicalStart,
|
if(IdentityMapping)
|
||||||
Descriptor->NumberOfPages, MemoryType);
|
{
|
||||||
|
/* Add any non-free memory using identity mapping */
|
||||||
|
Status = MapVirtualMemory(PageMap, Descriptor->PhysicalStart + KSEG0_BASE, Descriptor->PhysicalStart,
|
||||||
|
Descriptor->NumberOfPages, MemoryType);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Add any non-free memory using sequential mapping */
|
||||||
|
Status = MapVirtualMemory(PageMap, VirtualAddress, Descriptor->PhysicalStart,
|
||||||
|
Descriptor->NumberOfPages, MemoryType);
|
||||||
|
|
||||||
/* Calculate next valid virtual address */
|
/* Update virtual address */
|
||||||
VirtualAddress += Descriptor->NumberOfPages * EFI_PAGE_SIZE;
|
VirtualAddress = VirtualAddress + (Descriptor->NumberOfPages * MM_PAGE_SIZE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Map all other memory as loader free */
|
/* Map all other memory as loader free */
|
||||||
Status = MapVirtualMemory(PageMap, NULLPTR, (PVOID)Descriptor->PhysicalStart,
|
Status = MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Descriptor->PhysicalStart,
|
||||||
Descriptor->NumberOfPages, LoaderFree);
|
Descriptor->NumberOfPages, LoaderFree);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -436,7 +460,7 @@ Memory::MapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Always map first page */
|
/* Always map first page */
|
||||||
Status = MapVirtualMemory(PageMap, NULLPTR, (PVOID)0, 1, LoaderFirmwarePermanent);
|
Status = MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, 0, 1, LoaderFirmwarePermanent);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Mapping failed */
|
/* Mapping failed */
|
||||||
@@ -444,7 +468,7 @@ Memory::MapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Map BIOS ROM and VRAM */
|
/* Map BIOS ROM and VRAM */
|
||||||
Status = MapVirtualMemory(PageMap, NULLPTR, (PVOID)0xA0000, 0x60, LoaderFirmwarePermanent);
|
Status = MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, 0xA0000, 0x60, LoaderFirmwarePermanent);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Mapping failed */
|
/* Mapping failed */
|
||||||
@@ -452,7 +476,7 @@ Memory::MapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Store next valid virtual address and return success */
|
/* Store next valid virtual address and return success */
|
||||||
*MemoryMapAddress = VirtualAddress;
|
*BaseAddress = (PVOID)VirtualAddress;
|
||||||
return STATUS_EFI_SUCCESS;
|
return STATUS_EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -481,13 +505,13 @@ Memory::MapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Memory::MapVirtualMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
Memory::MapVirtualMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN PVOID VirtualAddress,
|
IN ULONGLONG VirtualAddress,
|
||||||
IN PVOID PhysicalAddress,
|
IN ULONGLONG PhysicalAddress,
|
||||||
IN ULONGLONG NumberOfPages,
|
IN ULONGLONG NumberOfPages,
|
||||||
IN LOADER_MEMORY_TYPE MemoryType)
|
IN LOADER_MEMORY_TYPE MemoryType)
|
||||||
{
|
{
|
||||||
PXTBL_MEMORY_MAPPING Mapping1, Mapping2, Mapping3;
|
PXTBL_MEMORY_MAPPING Mapping1, Mapping2, Mapping3;
|
||||||
PVOID PhysicalAddressEnd, PhysicalAddress2End;
|
ULONGLONG PhysicalAddressEnd, PhysicalAddress2End;
|
||||||
PLIST_ENTRY ListEntry, MappingListEntry;
|
PLIST_ENTRY ListEntry, MappingListEntry;
|
||||||
SIZE_T NumberOfMappedPages;
|
SIZE_T NumberOfMappedPages;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@@ -507,7 +531,7 @@ Memory::MapVirtualMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
Mapping1->MemoryType = MemoryType;
|
Mapping1->MemoryType = MemoryType;
|
||||||
|
|
||||||
/* Calculate the end of the physical address */
|
/* Calculate the end of the physical address */
|
||||||
PhysicalAddressEnd = (PVOID)((ULONG_PTR)PhysicalAddress + (NumberOfPages * EFI_PAGE_SIZE) - 1);
|
PhysicalAddressEnd = PhysicalAddress + (NumberOfPages * EFI_PAGE_SIZE) - 1;
|
||||||
|
|
||||||
/* Iterate through all the mappings already set to insert new mapping at the correct place */
|
/* Iterate through all the mappings already set to insert new mapping at the correct place */
|
||||||
ListEntry = PageMap->MemoryMap.Flink;
|
ListEntry = PageMap->MemoryMap.Flink;
|
||||||
@@ -515,7 +539,7 @@ Memory::MapVirtualMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
{
|
{
|
||||||
/* Take a mapping from the list and calculate its end of physical address */
|
/* Take a mapping from the list and calculate its end of physical address */
|
||||||
Mapping2 = CONTAIN_RECORD(ListEntry, XTBL_MEMORY_MAPPING, ListEntry);
|
Mapping2 = CONTAIN_RECORD(ListEntry, XTBL_MEMORY_MAPPING, ListEntry);
|
||||||
PhysicalAddress2End = (PVOID)((ULONG_PTR)Mapping2->PhysicalAddress + (Mapping2->NumberOfPages * EFI_PAGE_SIZE) - 1);
|
PhysicalAddress2End = Mapping2->PhysicalAddress + (Mapping2->NumberOfPages * EFI_PAGE_SIZE) - 1;
|
||||||
|
|
||||||
/* Check if new mapping is a subset of an existing mapping */
|
/* Check if new mapping is a subset of an existing mapping */
|
||||||
if(Mapping1->PhysicalAddress >= Mapping2->PhysicalAddress && PhysicalAddressEnd <= PhysicalAddress2End)
|
if(Mapping1->PhysicalAddress >= Mapping2->PhysicalAddress && PhysicalAddressEnd <= PhysicalAddress2End)
|
||||||
@@ -523,7 +547,8 @@ Memory::MapVirtualMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
/* Make sure it's memory type is the same */
|
/* Make sure it's memory type is the same */
|
||||||
if(Mapping1->MemoryType == Mapping2->MemoryType)
|
if(Mapping1->MemoryType == Mapping2->MemoryType)
|
||||||
{
|
{
|
||||||
/* It is already mapped */
|
/* Free the unused mapping structure and return success */
|
||||||
|
FreePool(Mapping1);
|
||||||
return STATUS_EFI_SUCCESS;
|
return STATUS_EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -539,7 +564,7 @@ Memory::MapVirtualMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate number of pages for this mapping */
|
/* Calculate number of pages for this mapping */
|
||||||
NumberOfMappedPages = ((PUCHAR)PhysicalAddress2End - (PUCHAR)PhysicalAddressEnd) / EFI_PAGE_SIZE;
|
NumberOfMappedPages = (PhysicalAddress2End - PhysicalAddressEnd) / EFI_PAGE_SIZE;
|
||||||
if(NumberOfMappedPages > 0)
|
if(NumberOfMappedPages > 0)
|
||||||
{
|
{
|
||||||
/* Pages associated to the mapping, allocate memory for it */
|
/* Pages associated to the mapping, allocate memory for it */
|
||||||
@@ -550,18 +575,21 @@ Memory::MapVirtualMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set mapping fields and insert it on the top */
|
/* Set mapping fields */
|
||||||
Mapping3->PhysicalAddress = (PUCHAR)PhysicalAddressEnd + 1;
|
Mapping3->PhysicalAddress = PhysicalAddressEnd + 1;
|
||||||
Mapping3->VirtualAddress = NULLPTR;
|
Mapping3->VirtualAddress = (ULONGLONG)NULLPTR;
|
||||||
Mapping3->NumberOfPages = NumberOfMappedPages;
|
Mapping3->NumberOfPages = NumberOfMappedPages;
|
||||||
Mapping3->MemoryType = Mapping2->MemoryType;
|
Mapping3->MemoryType = Mapping2->MemoryType;
|
||||||
|
|
||||||
|
/* Insert new mapping in front of the list and increase page map size */
|
||||||
RTL::LinkedList::InsertHeadList(&Mapping2->ListEntry, &Mapping3->ListEntry);
|
RTL::LinkedList::InsertHeadList(&Mapping2->ListEntry, &Mapping3->ListEntry);
|
||||||
|
PageMap->MapSize++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate number of pages and the end of the physical address */
|
/* Calculate number of pages and the end of the physical address */
|
||||||
Mapping2->NumberOfPages = ((PUCHAR)PhysicalAddressEnd + 1 -
|
Mapping2->NumberOfPages = ((PUCHAR)PhysicalAddressEnd + 1 -
|
||||||
(PUCHAR)Mapping2->PhysicalAddress) / EFI_PAGE_SIZE;
|
(PUCHAR)Mapping2->PhysicalAddress) / EFI_PAGE_SIZE;
|
||||||
PhysicalAddress2End = (PVOID)((ULONG_PTR)Mapping2->PhysicalAddress + (Mapping2->NumberOfPages * EFI_PAGE_SIZE) - 1);
|
PhysicalAddress2End = Mapping2->PhysicalAddress + (Mapping2->NumberOfPages * EFI_PAGE_SIZE) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if they overlap */
|
/* Check if they overlap */
|
||||||
@@ -586,18 +614,21 @@ Memory::MapVirtualMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set mapping fields and insert it on the top */
|
/* Set mapping fields */
|
||||||
Mapping3->PhysicalAddress = Mapping1->PhysicalAddress;
|
Mapping3->PhysicalAddress = Mapping1->PhysicalAddress;
|
||||||
Mapping3->VirtualAddress = NULLPTR;
|
Mapping3->VirtualAddress = (ULONGLONG)NULLPTR;
|
||||||
Mapping3->NumberOfPages = NumberOfMappedPages;
|
Mapping3->NumberOfPages = NumberOfMappedPages;
|
||||||
Mapping3->MemoryType = Mapping2->MemoryType;
|
Mapping3->MemoryType = Mapping2->MemoryType;
|
||||||
|
|
||||||
|
/* Insert new mapping in front of the list and increase page map size */
|
||||||
RTL::LinkedList::InsertHeadList(&Mapping2->ListEntry, &Mapping3->ListEntry);
|
RTL::LinkedList::InsertHeadList(&Mapping2->ListEntry, &Mapping3->ListEntry);
|
||||||
|
PageMap->MapSize++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate number of pages and the end of the physical address */
|
/* Calculate number of pages and the end of the physical address */
|
||||||
Mapping2->NumberOfPages = ((PUCHAR)Mapping1->PhysicalAddress -
|
Mapping2->NumberOfPages = ((PUCHAR)Mapping1->PhysicalAddress -
|
||||||
(PUCHAR)Mapping2->PhysicalAddress) / EFI_PAGE_SIZE;
|
(PUCHAR)Mapping2->PhysicalAddress) / EFI_PAGE_SIZE;
|
||||||
PhysicalAddress2End = (PVOID)((ULONG_PTR)Mapping2->PhysicalAddress + (Mapping2->NumberOfPages * EFI_PAGE_SIZE) - 1);
|
PhysicalAddress2End = Mapping2->PhysicalAddress + (Mapping2->NumberOfPages * EFI_PAGE_SIZE) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if mapping is really needed */
|
/* Check if mapping is really needed */
|
||||||
@@ -619,15 +650,19 @@ Memory::MapVirtualMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
Status = FreePool(Mapping2);
|
Status = FreePool(Mapping2);
|
||||||
ListEntry = MappingListEntry;
|
ListEntry = MappingListEntry;
|
||||||
|
|
||||||
/* Go to the next mapping */
|
/* Decrease page map size and go to the next mapping */
|
||||||
|
PageMap->MapSize--;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine physical address order */
|
/* Determine physical address order */
|
||||||
if(Mapping2->PhysicalAddress > Mapping1->PhysicalAddress)
|
if(Mapping2->PhysicalAddress > Mapping1->PhysicalAddress)
|
||||||
{
|
{
|
||||||
/* Insert new mapping in front */
|
/* Insert new mapping in front of the list and increase page map size */
|
||||||
RTL::LinkedList::InsertHeadList(Mapping2->ListEntry.Blink, &Mapping1->ListEntry);
|
RTL::LinkedList::InsertHeadList(Mapping2->ListEntry.Blink, &Mapping1->ListEntry);
|
||||||
|
PageMap->MapSize++;
|
||||||
|
|
||||||
|
/* Return success */
|
||||||
return STATUS_EFI_SUCCESS;
|
return STATUS_EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -635,7 +670,7 @@ Memory::MapVirtualMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
|||||||
ListEntry = ListEntry->Flink;
|
ListEntry = ListEntry->Flink;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Insert new mapping to the list and increase page map size */
|
/* Insert new mapping to the tail of the list and increase page map size */
|
||||||
RTL::LinkedList::InsertTailList(&PageMap->MemoryMap, &Mapping1->ListEntry);
|
RTL::LinkedList::InsertTailList(&PageMap->MemoryMap, &Mapping1->ListEntry);
|
||||||
PageMap->MapSize++;
|
PageMap->MapSize++;
|
||||||
|
|
||||||
@@ -729,11 +729,11 @@ PeCoff::RelocateLoadedImage(IN PPECOFF_IMAGE_CONTEXT Image)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Check if loaded 32-bit PE32 image should be relocated */
|
|
||||||
/* Set relocation data directory and image base address */
|
/* Set relocation data directory and image base address */
|
||||||
DataDirectory = &Image->PeHeader->OptionalHeader32.DataDirectory[PECOFF_IMAGE_DIRECTORY_ENTRY_BASERELOC];
|
DataDirectory = &Image->PeHeader->OptionalHeader32.DataDirectory[PECOFF_IMAGE_DIRECTORY_ENTRY_BASERELOC];
|
||||||
ImageBase = Image->PeHeader->OptionalHeader32.ImageBase;
|
ImageBase = Image->PeHeader->OptionalHeader32.ImageBase;
|
||||||
|
|
||||||
|
/* Check if loaded 32-bit PE32 image should be relocated */
|
||||||
if(Image->PeHeader->OptionalHeader32.NumberOfRvaAndSizes <= PECOFF_IMAGE_DIRECTORY_ENTRY_BASERELOC ||
|
if(Image->PeHeader->OptionalHeader32.NumberOfRvaAndSizes <= PECOFF_IMAGE_DIRECTORY_ENTRY_BASERELOC ||
|
||||||
DataDirectory->VirtualAddress == 0 || DataDirectory->Size < sizeof(PECOFF_IMAGE_BASE_RELOCATION))
|
DataDirectory->VirtualAddress == 0 || DataDirectory->Size < sizeof(PECOFF_IMAGE_BASE_RELOCATION))
|
||||||
{
|
{
|
||||||
@@ -10,6 +10,49 @@
|
|||||||
#include <xtos.hh>
|
#include <xtos.hh>
|
||||||
|
|
||||||
|
|
||||||
|
XTCDECL
|
||||||
|
EFI_STATUS
|
||||||
|
Xtos::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
/* Build page map */
|
||||||
|
Status = XtLdrProtocol->Memory.BuildPageMap(PageMap, (PageMap->PageMapLevel > 4) ? MM_P5E_LA57_BASE : MM_PXE_BASE);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Failed to build page map */
|
||||||
|
XtLdrProtocol->Debug.Print(L"Failed to build page map (Status code: %zX)\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Map memory for hardware layer */
|
||||||
|
Status = MapHardwareMemoryPool(PageMap);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Failed to map memory for hardware layer */
|
||||||
|
XtLdrProtocol->Debug.Print(L"Failed to map memory for hardware leyer (Status code: %zX)\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return success */
|
||||||
|
return STATUS_EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines the appropriate EFI memory mapping strategy for the AMD64 architecture.
|
||||||
|
*
|
||||||
|
* @return This routine returns TRUE, what results in an identity mapping.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
BOOLEAN
|
||||||
|
Xtos::DetermineMappingStrategy()
|
||||||
|
{
|
||||||
|
/* Use an identity mapping strategy */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines the appropriate paging level (PML) for the AMD64 architecture.
|
* Determines the appropriate paging level (PML) for the AMD64 architecture.
|
||||||
*
|
*
|
||||||
@@ -76,24 +119,6 @@ Xtos::EnablePaging(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
ULONG_PTR TrampolineSize;
|
ULONG_PTR TrampolineSize;
|
||||||
PVOID TrampolineCode;
|
PVOID TrampolineCode;
|
||||||
|
|
||||||
/* Build page map */
|
|
||||||
Status = XtLdrProtocol->Memory.BuildPageMap(PageMap, (PageMap->PageMapLevel > 4) ? MM_P5E_LA57_BASE : MM_PXE_BASE);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
/* Failed to build page map */
|
|
||||||
XtLdrProtocol->Debug.Print(L"Failed to build page map (Status code: %zX)\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Map memory for hardware layer */
|
|
||||||
Status = MapHardwareMemoryPool(PageMap);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
/* Failed to map memory for hardware layer */
|
|
||||||
XtLdrProtocol->Debug.Print(L"Failed to map memory for hardware leyer (Status code: %zX)\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check the configured page map level to set the LA57 state accordingly */
|
/* Check the configured page map level to set the LA57 state accordingly */
|
||||||
if(PageMap->PageMapLevel == 5)
|
if(PageMap->PageMapLevel == 5)
|
||||||
{
|
{
|
||||||
@@ -173,6 +198,7 @@ Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
PHARDWARE_PTE P5eBase, PdeBase, PpeBase, PxeBase;
|
PHARDWARE_PTE P5eBase, PdeBase, PpeBase, PxeBase;
|
||||||
EFI_PHYSICAL_ADDRESS Address;
|
EFI_PHYSICAL_ADDRESS Address;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
ULONG Index;
|
||||||
|
|
||||||
if(PageMap->PageMapLevel == 5)
|
if(PageMap->PageMapLevel == 5)
|
||||||
{
|
{
|
||||||
@@ -190,6 +216,9 @@ Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Map hardware memory */
|
||||||
|
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
||||||
|
|
||||||
/* Zero fill memory used by P5E */
|
/* Zero fill memory used by P5E */
|
||||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||||
|
|
||||||
@@ -224,6 +253,9 @@ Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Map hardware memory */
|
||||||
|
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
||||||
|
|
||||||
/* Zero fill memory used by PXE */
|
/* Zero fill memory used by PXE */
|
||||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||||
|
|
||||||
@@ -252,6 +284,9 @@ Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Map hardware memory */
|
||||||
|
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
||||||
|
|
||||||
/* Zero fill memory used by PPE */
|
/* Zero fill memory used by PPE */
|
||||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||||
|
|
||||||
@@ -270,7 +305,7 @@ Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Loop through 2 PDE entries */
|
/* Loop through 2 PDE entries */
|
||||||
for(UINT Index = 0 ; Index < 2 ; Index++)
|
for(Index = 0 ; Index < 2 ; Index++)
|
||||||
{
|
{
|
||||||
/* Check if PDE entry already exists */
|
/* Check if PDE entry already exists */
|
||||||
if(!PdeBase[((MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF) + Index].Valid)
|
if(!PdeBase[((MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF) + Index].Valid)
|
||||||
@@ -283,6 +318,9 @@ Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Map hardware memory */
|
||||||
|
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
||||||
|
|
||||||
/* Zero fill memory used by PDE */
|
/* Zero fill memory used by PDE */
|
||||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||||
|
|
||||||
@@ -9,6 +9,62 @@
|
|||||||
#include <xtos.hh>
|
#include <xtos.hh>
|
||||||
|
|
||||||
|
|
||||||
|
XTCDECL
|
||||||
|
EFI_STATUS
|
||||||
|
Xtos::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap)
|
||||||
|
{
|
||||||
|
ULONG_PTR SelfMapAddress;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
/* Initialize self map address */
|
||||||
|
if(PageMap->PageMapLevel == 3)
|
||||||
|
{
|
||||||
|
/* For PML3 (PAE) use PTE base address */
|
||||||
|
SelfMapAddress = MM_PTE_BASE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* For PML2 (PAE disabled) use legacy PDE base address */
|
||||||
|
SelfMapAddress = MM_PDE_LEGACY_BASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Build page map */
|
||||||
|
Status = XtLdrProtocol->Memory.BuildPageMap(PageMap, SelfMapAddress);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Failed to build page map */
|
||||||
|
XtLdrProtocol->Debug.Print(L"Failed to build page map (Status code: %zX)\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Map memory for hardware layer */
|
||||||
|
Status = MapHardwareMemoryPool(PageMap);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Failed to map memory for hardware layer */
|
||||||
|
XtLdrProtocol->Debug.Print(L"Failed to map memory for hardware layer (Status code: %zX)\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return success */
|
||||||
|
return STATUS_EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines the appropriate EFI memory mapping strategy for the i686 architecture.
|
||||||
|
*
|
||||||
|
* @return This routine returns FALSE, what results in a sequential mapping.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
BOOLEAN
|
||||||
|
Xtos::DetermineMappingStrategy()
|
||||||
|
{
|
||||||
|
/* Use a sequential mapping strategy */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines the appropriate paging level (PML) for the i686 architecture.
|
* Determines the appropriate paging level (PML) for the i686 architecture.
|
||||||
*
|
*
|
||||||
@@ -60,24 +116,6 @@ Xtos::EnablePaging(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
/* Build page map */
|
|
||||||
Status = XtLdrProtocol->Memory.BuildPageMap(PageMap, MM_PTE_BASE);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
/* Failed to build page map */
|
|
||||||
XtLdrProtocol->Debug.Print(L"Failed to build page map (Status code: %zX)\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Map memory for hardware layer */
|
|
||||||
Status = MapHardwareMemoryPool(PageMap);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
/* Failed to map memory for hardware layer */
|
|
||||||
XtLdrProtocol->Debug.Print(L"Failed to map memory for hardware layer (Status code: %zX)\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Exit EFI Boot Services */
|
/* Exit EFI Boot Services */
|
||||||
XtLdrProtocol->Debug.Print(L"Exiting EFI boot services\n");
|
XtLdrProtocol->Debug.Print(L"Exiting EFI boot services\n");
|
||||||
Status = XtLdrProtocol->Utils.ExitBootServices();
|
Status = XtLdrProtocol->Utils.ExitBootServices();
|
||||||
@@ -145,6 +183,9 @@ Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
/* Zero fill allocated memory */
|
/* Zero fill allocated memory */
|
||||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||||
|
|
||||||
|
/* Map hardware memory */
|
||||||
|
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
||||||
|
|
||||||
/* Check if PAE is enabled (3-level paging) */
|
/* Check if PAE is enabled (3-level paging) */
|
||||||
if(PageMap->PageMapLevel == 3)
|
if(PageMap->PageMapLevel == 3)
|
||||||
{
|
{
|
||||||
@@ -38,7 +38,9 @@ class Xtos
|
|||||||
IN PVOID PhysicalAddress,
|
IN PVOID PhysicalAddress,
|
||||||
IN UINT NumberOfPages,
|
IN UINT NumberOfPages,
|
||||||
IN LOADER_MEMORY_TYPE MemoryType);
|
IN LOADER_MEMORY_TYPE MemoryType);
|
||||||
|
STATIC XTCDECL EFI_STATUS BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap);
|
||||||
STATIC XTCDECL LOADER_MEMORY_TYPE ConvertEfiMemoryType(IN EFI_MEMORY_TYPE EfiMemoryType);
|
STATIC XTCDECL LOADER_MEMORY_TYPE ConvertEfiMemoryType(IN EFI_MEMORY_TYPE EfiMemoryType);
|
||||||
|
STATIC XTCDECL BOOLEAN DetermineMappingStrategy();
|
||||||
STATIC XTCDECL ULONG DeterminePagingLevel(IN CONST PWCHAR Parameters);
|
STATIC XTCDECL ULONG DeterminePagingLevel(IN CONST PWCHAR Parameters);
|
||||||
STATIC XTCDECL EFI_STATUS EnablePaging(IN PXTBL_PAGE_MAPPING PageMap);
|
STATIC XTCDECL EFI_STATUS EnablePaging(IN PXTBL_PAGE_MAPPING PageMap);
|
||||||
STATIC XTCDECL VOID GetDisplayInformation(OUT PSYSTEM_RESOURCE_FRAMEBUFFER FrameBufferResource,
|
STATIC XTCDECL VOID GetDisplayInformation(OUT PSYSTEM_RESOURCE_FRAMEBUFFER FrameBufferResource,
|
||||||
@@ -46,10 +48,13 @@ class Xtos
|
|||||||
IN PULONG_PTR FrameBufferSize,
|
IN PULONG_PTR FrameBufferSize,
|
||||||
IN PXTBL_FRAMEBUFFER_MODE_INFORMATION FrameBufferModeInfo);
|
IN PXTBL_FRAMEBUFFER_MODE_INFORMATION FrameBufferModeInfo);
|
||||||
STATIC XTCDECL EFI_STATUS GetMemoryDescriptorList(IN PXTBL_PAGE_MAPPING PageMap,
|
STATIC XTCDECL EFI_STATUS GetMemoryDescriptorList(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN PVOID *VirtualAddress,
|
IN EFI_PHYSICAL_ADDRESS PhysicalBase,
|
||||||
|
IN PVOID VirtualBase,
|
||||||
OUT PLIST_ENTRY MemoryDescriptorList);
|
OUT PLIST_ENTRY MemoryDescriptorList);
|
||||||
STATIC XTCDECL EFI_STATUS GetSystemResourcesList(IN PXTBL_PAGE_MAPPING PageMap,
|
STATIC XTCDECL EFI_STATUS GetSystemResourcesList(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN PVOID *VirtualAddress,
|
IN EFI_PHYSICAL_ADDRESS PhysicalBase,
|
||||||
|
IN PVOID VirtualBase,
|
||||||
|
IN PVOID FrameBufferVirtualBase,
|
||||||
OUT PLIST_ENTRY SystemResourcesList);
|
OUT PLIST_ENTRY SystemResourcesList);
|
||||||
STATIC XTCDECL EFI_STATUS GetVirtualAddress(IN PLIST_ENTRY MemoryMappings,
|
STATIC XTCDECL EFI_STATUS GetVirtualAddress(IN PLIST_ENTRY MemoryMappings,
|
||||||
IN PVOID PhysicalAddress,
|
IN PVOID PhysicalAddress,
|
||||||
@@ -191,56 +191,52 @@ Xtos::GetDisplayInformation(OUT PSYSTEM_RESOURCE_FRAMEBUFFER FrameBufferResource
|
|||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Xtos::GetMemoryDescriptorList(IN PXTBL_PAGE_MAPPING PageMap,
|
Xtos::GetMemoryDescriptorList(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN PVOID *VirtualAddress,
|
IN EFI_PHYSICAL_ADDRESS PhysicalBase,
|
||||||
|
IN PVOID VirtualBase,
|
||||||
OUT PLIST_ENTRY MemoryDescriptorList)
|
OUT PLIST_ENTRY MemoryDescriptorList)
|
||||||
{
|
{
|
||||||
EFI_PHYSICAL_ADDRESS Address;
|
PLOADER_MEMORY_DESCRIPTOR Descriptor;
|
||||||
EFI_STATUS Status;
|
PXTBL_MEMORY_MAPPING MemoryMapping;
|
||||||
ULONGLONG Pages;
|
|
||||||
|
|
||||||
Pages = (ULONGLONG)EFI_SIZE_TO_PAGES((PageMap->MapSize + 1) * sizeof(LOADER_MEMORY_DESCRIPTOR));
|
|
||||||
|
|
||||||
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, Pages, &Address);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = XtLdrProtocol->Memory.MapVirtualMemory(PageMap, *VirtualAddress, (PVOID)Address, Pages, LoaderMemoryData);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
XtLdrProtocol->Memory.FreePages(Address, Pages);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
PVOID PhysicalBase = (PVOID)Address;
|
|
||||||
|
|
||||||
PLIST_ENTRY ListEntry;
|
PLIST_ENTRY ListEntry;
|
||||||
|
|
||||||
|
/* Initialize the descriptor pointer to the start of the allocated physical buffer */
|
||||||
|
Descriptor = (PLOADER_MEMORY_DESCRIPTOR)PhysicalBase;
|
||||||
|
|
||||||
|
/* Get the first entry from the internal boot loader memory map */
|
||||||
ListEntry = PageMap->MemoryMap.Flink;
|
ListEntry = PageMap->MemoryMap.Flink;
|
||||||
|
|
||||||
|
/* Iterate through the internal memory map and populate the loader descriptor list */
|
||||||
while(ListEntry != &PageMap->MemoryMap)
|
while(ListEntry != &PageMap->MemoryMap)
|
||||||
{
|
{
|
||||||
PXTBL_MEMORY_MAPPING MemoryMapping = CONTAIN_RECORD(ListEntry, XTBL_MEMORY_MAPPING, ListEntry);
|
/* Retrieve the internal memory mapping record from the current list entry */
|
||||||
PLOADER_MEMORY_DESCRIPTOR MemoryDescriptor = (PLOADER_MEMORY_DESCRIPTOR)Address;
|
MemoryMapping = CONTAIN_RECORD(ListEntry, XTBL_MEMORY_MAPPING, ListEntry);
|
||||||
|
|
||||||
MemoryDescriptor->MemoryType = MemoryMapping->MemoryType;
|
/* Transfer memory type and address information to the kernel descriptor */
|
||||||
MemoryDescriptor->BasePage = (UINT_PTR)MemoryMapping->PhysicalAddress / EFI_PAGE_SIZE;
|
Descriptor->MemoryType = MemoryMapping->MemoryType;
|
||||||
MemoryDescriptor->PageCount = MemoryMapping->NumberOfPages;
|
Descriptor->BasePage = (UINT_PTR)(MemoryMapping->PhysicalAddress / EFI_PAGE_SIZE);
|
||||||
|
Descriptor->PageCount = (ULONG)MemoryMapping->NumberOfPages;
|
||||||
|
|
||||||
XtLdrProtocol->LinkedList.InsertTail(MemoryDescriptorList, &MemoryDescriptor->ListEntry);
|
/* Link the entry */
|
||||||
|
XtLdrProtocol->LinkedList.InsertTail(MemoryDescriptorList, &Descriptor->ListEntry);
|
||||||
|
|
||||||
Address = Address + sizeof(LOADER_MEMORY_DESCRIPTOR);
|
/* Move to the next slot in the allocated buffer */
|
||||||
|
Descriptor++;
|
||||||
ListEntry = ListEntry->Flink;
|
ListEntry = ListEntry->Flink;
|
||||||
}
|
}
|
||||||
|
|
||||||
XtLdrProtocol->Memory.PhysicalListToVirtual(PageMap, MemoryDescriptorList, PhysicalBase, *VirtualAddress);
|
/* Convert all physical link pointers in the list to their corresponding virtual addresses */
|
||||||
|
XtLdrProtocol->Memory.PhysicalListToVirtual(PageMap, MemoryDescriptorList, (PVOID)PhysicalBase, VirtualBase);
|
||||||
|
|
||||||
|
/* Return success */
|
||||||
return STATUS_EFI_SUCCESS;
|
return STATUS_EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Xtos::GetSystemResourcesList(IN PXTBL_PAGE_MAPPING PageMap,
|
Xtos::GetSystemResourcesList(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN PVOID *VirtualAddress,
|
IN EFI_PHYSICAL_ADDRESS PhysicalBase,
|
||||||
|
IN PVOID VirtualBase,
|
||||||
|
IN PVOID FrameBufferVirtualBase,
|
||||||
OUT PLIST_ENTRY SystemResourcesList)
|
OUT PLIST_ENTRY SystemResourcesList)
|
||||||
{
|
{
|
||||||
XTSTATUS Status;
|
XTSTATUS Status;
|
||||||
@@ -251,39 +247,18 @@ Xtos::GetSystemResourcesList(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
PXTBL_FRAMEBUFFER_PROTOCOL FrameBufProtocol;
|
PXTBL_FRAMEBUFFER_PROTOCOL FrameBufProtocol;
|
||||||
XTBL_FRAMEBUFFER_MODE_INFORMATION FbModeInfo;
|
XTBL_FRAMEBUFFER_MODE_INFORMATION FbModeInfo;
|
||||||
EFI_PHYSICAL_ADDRESS FbAddress;
|
EFI_PHYSICAL_ADDRESS FbAddress;
|
||||||
|
EFI_PHYSICAL_ADDRESS OriginalPhysicalBase;
|
||||||
ULONG_PTR FbSize;
|
ULONG_PTR FbSize;
|
||||||
UINT FrameBufferPages;
|
|
||||||
PSYSTEM_RESOURCE_FRAMEBUFFER FrameBufferResource;
|
PSYSTEM_RESOURCE_FRAMEBUFFER FrameBufferResource;
|
||||||
PSYSTEM_RESOURCE_ACPI AcpiResource;
|
PSYSTEM_RESOURCE_ACPI AcpiResource;
|
||||||
ULONGLONG Pages;
|
|
||||||
EFI_PHYSICAL_ADDRESS Address;
|
|
||||||
PVOID PhysicalBase, VirtualBase;
|
|
||||||
|
|
||||||
Pages = (ULONGLONG)EFI_SIZE_TO_PAGES(sizeof(SYSTEM_RESOURCE_ACPI) + sizeof(SYSTEM_RESOURCE_FRAMEBUFFER));
|
/* Save original physical base */
|
||||||
|
OriginalPhysicalBase = PhysicalBase;
|
||||||
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, Pages, &Address);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
Status = XtLdrProtocol->Memory.MapVirtualMemory(PageMap, *VirtualAddress, (PVOID)Address, Pages, LoaderFirmwarePermanent);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
XtLdrProtocol->Memory.FreePages(Address, Pages);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
PhysicalBase = (PVOID)Address;
|
|
||||||
VirtualBase = *VirtualAddress;
|
|
||||||
|
|
||||||
/* Calculate next valid virtual address */
|
|
||||||
*VirtualAddress = (PUINT8)*VirtualAddress + (Pages * EFI_PAGE_SIZE);
|
|
||||||
|
|
||||||
AcpiResource = (PSYSTEM_RESOURCE_ACPI)Address;
|
|
||||||
|
|
||||||
|
AcpiResource = (PSYSTEM_RESOURCE_ACPI)PhysicalBase;
|
||||||
XtLdrProtocol->Memory.ZeroMemory(AcpiResource, sizeof(SYSTEM_RESOURCE_ACPI));
|
XtLdrProtocol->Memory.ZeroMemory(AcpiResource, sizeof(SYSTEM_RESOURCE_ACPI));
|
||||||
|
|
||||||
/* Load FrameBuffer protocol */
|
/* Load ACPI protocol */
|
||||||
Status = XtLdrProtocol->Protocol.Open(&ProtocolHandle, (PVOID*)&AcpiProtocol, &AcpiGuid);
|
Status = XtLdrProtocol->Protocol.Open(&ProtocolHandle, (PVOID*)&AcpiProtocol, &AcpiGuid);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
@@ -302,13 +277,11 @@ Xtos::GetSystemResourcesList(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
|
|
||||||
XtLdrProtocol->LinkedList.InsertTail(SystemResourcesList, &AcpiResource->Header.ListEntry);
|
XtLdrProtocol->LinkedList.InsertTail(SystemResourcesList, &AcpiResource->Header.ListEntry);
|
||||||
|
|
||||||
/* Close FrameBuffer protocol */
|
/* Close ACPI protocol */
|
||||||
XtLdrProtocol->Protocol.Close(&ProtocolHandle, &FrameBufGuid);
|
XtLdrProtocol->Protocol.Close(&ProtocolHandle, &AcpiGuid);
|
||||||
|
|
||||||
Address = Address + sizeof(SYSTEM_RESOURCE_ACPI);
|
|
||||||
|
|
||||||
FrameBufferResource = (PSYSTEM_RESOURCE_FRAMEBUFFER)Address;
|
|
||||||
|
|
||||||
|
PhysicalBase = PhysicalBase + sizeof(SYSTEM_RESOURCE_ACPI);
|
||||||
|
FrameBufferResource = (PSYSTEM_RESOURCE_FRAMEBUFFER)PhysicalBase;
|
||||||
XtLdrProtocol->Memory.ZeroMemory(FrameBufferResource, sizeof(SYSTEM_RESOURCE_FRAMEBUFFER));
|
XtLdrProtocol->Memory.ZeroMemory(FrameBufferResource, sizeof(SYSTEM_RESOURCE_FRAMEBUFFER));
|
||||||
|
|
||||||
/* Load FrameBuffer protocol */
|
/* Load FrameBuffer protocol */
|
||||||
@@ -329,26 +302,16 @@ Xtos::GetSystemResourcesList(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate pages needed to map framebuffer */
|
/* Assign the pre-mapped virtual address to the resource block */
|
||||||
FrameBufferPages = EFI_SIZE_TO_PAGES(FbSize);
|
FrameBufferResource->Header.VirtualAddress = FrameBufferVirtualBase;
|
||||||
|
|
||||||
/* Rewrite framebuffer address by using virtual address */
|
|
||||||
FrameBufferResource->Header.VirtualAddress = *VirtualAddress;
|
|
||||||
|
|
||||||
/* Map frame buffer memory */
|
|
||||||
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, FrameBufferResource->Header.VirtualAddress,
|
|
||||||
FrameBufferResource->Header.PhysicalAddress,
|
|
||||||
FrameBufferPages, LoaderFirmwarePermanent);
|
|
||||||
|
|
||||||
/* Close FrameBuffer protocol */
|
|
||||||
XtLdrProtocol->Protocol.Close(&ProtocolHandle, &FrameBufGuid);
|
XtLdrProtocol->Protocol.Close(&ProtocolHandle, &FrameBufGuid);
|
||||||
|
|
||||||
*VirtualAddress = (PUINT8)*VirtualAddress + (FrameBufferPages * EFI_PAGE_SIZE);
|
|
||||||
|
|
||||||
XtLdrProtocol->LinkedList.InsertTail(SystemResourcesList, &FrameBufferResource->Header.ListEntry);
|
XtLdrProtocol->LinkedList.InsertTail(SystemResourcesList, &FrameBufferResource->Header.ListEntry);
|
||||||
|
|
||||||
XtLdrProtocol->Memory.PhysicalListToVirtual(PageMap, SystemResourcesList, PhysicalBase, VirtualBase);
|
/* Convert list pointers to virtual */
|
||||||
|
XtLdrProtocol->Memory.PhysicalListToVirtual(PageMap, SystemResourcesList, (PVOID)OriginalPhysicalBase, VirtualBase);
|
||||||
|
|
||||||
|
/* Return success */
|
||||||
return STATUS_EFI_SUCCESS;
|
return STATUS_EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -389,7 +352,7 @@ Xtos::InitializeApicBase(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Map APIC base address */
|
/* Map APIC base address */
|
||||||
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (PVOID)APIC_BASE, ApicBaseAddress, 1, LoaderFirmwarePermanent);
|
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, APIC_BASE, (ULONGLONG)ApicBaseAddress, 1, LoaderFirmwarePermanent);
|
||||||
return STATUS_EFI_SUCCESS;
|
return STATUS_EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -409,35 +372,100 @@ Xtos::InitializeApicBase(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Xtos::InitializeLoaderBlock(IN PXTBL_PAGE_MAPPING PageMap,
|
Xtos::InitializeLoaderBlock(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN PVOID *VirtualAddress,
|
IN OUT PVOID *VirtualAddress,
|
||||||
IN PXTBL_BOOT_PARAMETERS Parameters)
|
IN PXTBL_BOOT_PARAMETERS Parameters)
|
||||||
{
|
{
|
||||||
|
EFI_PHYSICAL_ADDRESS FbPhysicalAddress, PhysicalBlock, PhysicalDescriptor, PhysicalResources;
|
||||||
|
PVOID FbVirtualAddress, VirtualBlock, VirtualResources, VirtualDescriptor;
|
||||||
|
UINT BlockPages, DescriptorPages, FbPages, ParametersSize, ResourcesPages;
|
||||||
|
XTBL_FRAMEBUFFER_MODE_INFORMATION FbModeInfo;
|
||||||
|
PXTBL_FRAMEBUFFER_PROTOCOL FrameBufProtocol;
|
||||||
PKERNEL_INITIALIZATION_BLOCK LoaderBlock;
|
PKERNEL_INITIALIZATION_BLOCK LoaderBlock;
|
||||||
EFI_PHYSICAL_ADDRESS Address;
|
EFI_HANDLE ProtocolHandle;
|
||||||
// PVOID RuntimeServices;
|
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT BlockPages;
|
ULONG_PTR FbSize;
|
||||||
UINT ParametersSize;
|
|
||||||
|
EFI_GUID FrameBufGuid = XT_FRAMEBUFFER_PROTOCOL_GUID;
|
||||||
|
|
||||||
|
/* Initialize Framebuffer information */
|
||||||
|
FbPhysicalAddress = 0;
|
||||||
|
FbSize = 0;
|
||||||
|
FbVirtualAddress = NULLPTR;
|
||||||
|
FbPages = 0;
|
||||||
|
|
||||||
/* Calculate size of parameters */
|
/* Calculate size of parameters */
|
||||||
ParametersSize = (XtLdrProtocol->WideString.Length(Parameters->Parameters, 0) + 1) * sizeof(WCHAR);
|
ParametersSize = (XtLdrProtocol->WideString.Length(Parameters->Parameters, 0) + 1) * sizeof(WCHAR);
|
||||||
|
|
||||||
/* Calculate number of pages needed for initialization block */
|
/* Calculate number of pages needed for initialization block */
|
||||||
BlockPages = EFI_SIZE_TO_PAGES(sizeof(KERNEL_INITIALIZATION_BLOCK) + ParametersSize);
|
BlockPages = EFI_SIZE_TO_PAGES(sizeof(KERNEL_INITIALIZATION_BLOCK) + ParametersSize);
|
||||||
|
ResourcesPages = EFI_SIZE_TO_PAGES(sizeof(SYSTEM_RESOURCE_ACPI) + sizeof(SYSTEM_RESOURCE_FRAMEBUFFER));
|
||||||
|
|
||||||
/* Allocate memory for kernel initialization block */
|
/* Query Framebuffer size for allocation */
|
||||||
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, BlockPages, &Address);
|
if(XtLdrProtocol->Protocol.Open(&ProtocolHandle, (PVOID*)&FrameBufProtocol, &FrameBufGuid) == STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Get FrameBuffer information */
|
||||||
|
FrameBufProtocol->GetDisplayInformation(&FbPhysicalAddress, &FbSize, &FbModeInfo);
|
||||||
|
XtLdrProtocol->Protocol.Close(&ProtocolHandle, &FrameBufGuid);
|
||||||
|
}
|
||||||
|
FbPages = EFI_SIZE_TO_PAGES(FbSize);
|
||||||
|
|
||||||
|
/* Precommit page map to allocate memory */
|
||||||
|
XtLdrProtocol->Memory.CommitPageMap(PageMap);
|
||||||
|
|
||||||
|
/* Calculate number of pages needed for memory descriptor list */
|
||||||
|
DescriptorPages = EFI_SIZE_TO_PAGES(PageMap->MapSize * sizeof(LOADER_MEMORY_DESCRIPTOR) * 2);
|
||||||
|
|
||||||
|
/* Allocate memory for the kernel initialization block and boot parameters */
|
||||||
|
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, BlockPages, &PhysicalBlock);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Memory allocation failure */
|
/* Memory allocation failure, return status code */
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize and zero-fill kernel initialization block */
|
/* Allocate memory for the system resources data structures */
|
||||||
LoaderBlock = (PKERNEL_INITIALIZATION_BLOCK)(UINT_PTR)Address;
|
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, ResourcesPages, &PhysicalResources);
|
||||||
XtLdrProtocol->Memory.ZeroMemory(LoaderBlock, sizeof(KERNEL_INITIALIZATION_BLOCK) + ParametersSize);
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Memory allocation failure, return status code */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate memory for the memory descriptor list */
|
||||||
|
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, DescriptorPages, &PhysicalDescriptor);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Memory allocation failure, return status code */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Map the Kernel Initialization Block into virtual memory and advance the virtual address pointer */
|
||||||
|
VirtualBlock = *VirtualAddress;
|
||||||
|
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)VirtualBlock, PhysicalBlock, BlockPages, LoaderSystemBlock);
|
||||||
|
*VirtualAddress = (PUINT8)*VirtualAddress + (BlockPages * EFI_PAGE_SIZE);
|
||||||
|
|
||||||
|
/* Map the system resources physical memory into virtual address space and update the allocation pointer */
|
||||||
|
VirtualResources = *VirtualAddress;
|
||||||
|
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)VirtualResources, PhysicalResources, ResourcesPages, LoaderFirmwarePermanent);
|
||||||
|
*VirtualAddress = (PUINT8)*VirtualAddress + (ResourcesPages * EFI_PAGE_SIZE);
|
||||||
|
|
||||||
|
/* Check if a framebuffer was detected and requires memory mapping */
|
||||||
|
if(FbPages > 0)
|
||||||
|
{
|
||||||
|
/* Map the framebuffer physical memory range into virtual address space */
|
||||||
|
FbVirtualAddress = *VirtualAddress;
|
||||||
|
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)FbVirtualAddress, FbPhysicalAddress, FbPages, LoaderFirmwarePermanent);
|
||||||
|
*VirtualAddress = (PUINT8)*VirtualAddress + (FbPages * EFI_PAGE_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Map the allocated physical memory for memory descriptors into the virtual address space */
|
||||||
|
VirtualDescriptor = *VirtualAddress;
|
||||||
|
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)VirtualDescriptor, PhysicalDescriptor, DescriptorPages, LoaderMemoryData);
|
||||||
|
*VirtualAddress = (PUINT8)*VirtualAddress + (DescriptorPages * EFI_PAGE_SIZE);
|
||||||
|
|
||||||
/* Set basic loader block properties */
|
/* Set basic loader block properties */
|
||||||
|
XtLdrProtocol->Memory.ZeroMemory((PVOID)PhysicalBlock, sizeof(KERNEL_INITIALIZATION_BLOCK) + ParametersSize);
|
||||||
|
LoaderBlock = (PKERNEL_INITIALIZATION_BLOCK)PhysicalBlock;
|
||||||
LoaderBlock->BlockSize = sizeof(KERNEL_INITIALIZATION_BLOCK);
|
LoaderBlock->BlockSize = sizeof(KERNEL_INITIALIZATION_BLOCK);
|
||||||
LoaderBlock->BlockVersion = INITIALIZATION_BLOCK_VERSION;
|
LoaderBlock->BlockVersion = INITIALIZATION_BLOCK_VERSION;
|
||||||
LoaderBlock->ProtocolVersion = BOOT_PROTOCOL_VERSION;
|
LoaderBlock->ProtocolVersion = BOOT_PROTOCOL_VERSION;
|
||||||
@@ -445,40 +473,39 @@ Xtos::InitializeLoaderBlock(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
/* Set LoaderInformation block properties */
|
/* Set LoaderInformation block properties */
|
||||||
LoaderBlock->LoaderInformation.DbgPrint = (PVOID)XtLdrProtocol->Debug.Print;
|
LoaderBlock->LoaderInformation.DbgPrint = (PVOID)XtLdrProtocol->Debug.Print;
|
||||||
|
|
||||||
/* Attempt to find virtual address of the EFI Runtime Services */
|
/* Set FirmwareInformation block properties */
|
||||||
// Status = XtLdrProtocol->GetVirtualAddress(MemoryMappings, &EfiSystemTable->RuntimeServices->Hdr, &RuntimeServices);
|
LoaderBlock->FirmwareInformation.FirmwareType = SystemFirmwareEfi;
|
||||||
// if(Status == STATUS_EFI_SUCCESS)
|
// LoaderBlock->FirmwareInformation.EfiFirmware.EfiVersion = EfiSystemTable->Hdr.Revision;
|
||||||
// {
|
LoaderBlock->FirmwareInformation.EfiFirmware.EfiRuntimeServices = NULLPTR;
|
||||||
/* Set FirmwareInformation block properties */
|
|
||||||
LoaderBlock->FirmwareInformation.FirmwareType = SystemFirmwareEfi;
|
|
||||||
LoaderBlock->FirmwareInformation.EfiFirmware.EfiVersion = 0; //EfiSystemTable->Hdr.Revision;
|
|
||||||
LoaderBlock->FirmwareInformation.EfiFirmware.EfiRuntimeServices = NULLPTR;
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// /* Set invalid firmware type to indicate that kernel cannot rely on FirmwareInformation block */
|
|
||||||
// LoaderBlock->FirmwareInformation.FirmwareType = SystemFirmwareInvalid;
|
|
||||||
// }
|
|
||||||
|
|
||||||
/* Copy parameters to kernel initialization block */
|
/* Copy parameters to kernel initialization block */
|
||||||
LoaderBlock->KernelParameters = (PWCHAR)((UINT_PTR)*VirtualAddress + sizeof(KERNEL_INITIALIZATION_BLOCK));
|
LoaderBlock->KernelParameters = (PWCHAR)((UINT_PTR)VirtualBlock + sizeof(KERNEL_INITIALIZATION_BLOCK));
|
||||||
XtLdrProtocol->Memory.CopyMemory((PVOID)((UINT_PTR)LoaderBlock + sizeof(KERNEL_INITIALIZATION_BLOCK)),
|
XtLdrProtocol->Memory.CopyMemory((PVOID)((UINT_PTR)LoaderBlock + sizeof(KERNEL_INITIALIZATION_BLOCK)),
|
||||||
Parameters->Parameters,
|
Parameters->Parameters, ParametersSize);
|
||||||
ParametersSize);
|
|
||||||
|
|
||||||
/* Map kernel initialization block */
|
/* Commit mappings */
|
||||||
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, *VirtualAddress, (PVOID)LoaderBlock,
|
XtLdrProtocol->Memory.CommitPageMap(PageMap);
|
||||||
BlockPages, LoaderSystemBlock);
|
|
||||||
|
|
||||||
/* Calculate next valid virtual address */
|
|
||||||
*VirtualAddress = (PUINT8)*VirtualAddress + (BlockPages * EFI_PAGE_SIZE);
|
|
||||||
|
|
||||||
|
/* Initialize system resources list */
|
||||||
XtLdrProtocol->LinkedList.InitializeHead(&LoaderBlock->SystemResourcesListHead);
|
XtLdrProtocol->LinkedList.InitializeHead(&LoaderBlock->SystemResourcesListHead);
|
||||||
GetSystemResourcesList(PageMap, VirtualAddress, &LoaderBlock->SystemResourcesListHead);
|
Status = GetSystemResourcesList(PageMap, PhysicalResources, VirtualResources, FbVirtualAddress, &LoaderBlock->SystemResourcesListHead);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Failed to initialize system resources list, return status code */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize memory descriptor list */
|
/* Initialize memory descriptor list */
|
||||||
XtLdrProtocol->LinkedList.InitializeHead(&LoaderBlock->MemoryDescriptorListHead);
|
XtLdrProtocol->LinkedList.InitializeHead(&LoaderBlock->MemoryDescriptorListHead);
|
||||||
GetMemoryDescriptorList(PageMap, VirtualAddress, &LoaderBlock->MemoryDescriptorListHead);
|
Status = GetMemoryDescriptorList(PageMap, PhysicalDescriptor, VirtualDescriptor, &LoaderBlock->MemoryDescriptorListHead);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Failed to initialize memory descriptor list, return status code */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set boot image size */
|
||||||
|
LoaderBlock->BootImageSize = (PFN_NUMBER)(((ULONGLONG)*VirtualAddress - KSEG0_BASE) / EFI_PAGE_SIZE);
|
||||||
|
|
||||||
/* Return success */
|
/* Return success */
|
||||||
return STATUS_EFI_SUCCESS;
|
return STATUS_EFI_SUCCESS;
|
||||||
@@ -618,11 +645,12 @@ Xtos::RunBootSequence(IN PEFI_FILE_HANDLE BootDir,
|
|||||||
PXTBL_FRAMEBUFFER_PROTOCOL FrameBufProtocol;
|
PXTBL_FRAMEBUFFER_PROTOCOL FrameBufProtocol;
|
||||||
PPECOFF_IMAGE_CONTEXT ImageContext = NULLPTR;
|
PPECOFF_IMAGE_CONTEXT ImageContext = NULLPTR;
|
||||||
PEFI_LOADED_IMAGE_PROTOCOL ImageProtocol;
|
PEFI_LOADED_IMAGE_PROTOCOL ImageProtocol;
|
||||||
PVOID VirtualAddress, VirtualMemoryArea;
|
PVOID VirtualAddress;
|
||||||
PXT_ENTRY_POINT KernelEntryPoint;
|
PXT_ENTRY_POINT KernelEntryPoint;
|
||||||
EFI_HANDLE ProtocolHandle;
|
EFI_HANDLE ProtocolHandle;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
XTBL_PAGE_MAPPING PageMap;
|
XTBL_PAGE_MAPPING PageMap;
|
||||||
|
BOOLEAN IdentityMapping;
|
||||||
|
|
||||||
/* Initialize XTOS startup sequence */
|
/* Initialize XTOS startup sequence */
|
||||||
XtLdrProtocol->Debug.Print(L"Initializing XTOS startup sequence\n");
|
XtLdrProtocol->Debug.Print(L"Initializing XTOS startup sequence\n");
|
||||||
@@ -639,19 +667,30 @@ Xtos::RunBootSequence(IN PEFI_FILE_HANDLE BootDir,
|
|||||||
/* Close FrameBuffer protocol */
|
/* Close FrameBuffer protocol */
|
||||||
XtLdrProtocol->Protocol.Close(&ProtocolHandle, &FrameBufGuid);
|
XtLdrProtocol->Protocol.Close(&ProtocolHandle, &FrameBufGuid);
|
||||||
|
|
||||||
|
/* Determine whether to use a sequential or an identity mapping strategy */
|
||||||
|
IdentityMapping = DetermineMappingStrategy();
|
||||||
|
|
||||||
/* Set base virtual memory area for the kernel mappings */
|
/* Set base virtual memory area for the kernel mappings */
|
||||||
VirtualMemoryArea = (PVOID)KSEG0_BASE;
|
VirtualAddress = (PVOID)(KSEG0_BASE);
|
||||||
VirtualAddress = (PVOID)(KSEG0_BASE + KSEG0_KERNEL_BASE);
|
|
||||||
|
|
||||||
/* Initialize virtual memory mappings */
|
/* Initialize virtual memory mappings */
|
||||||
XtLdrProtocol->Memory.InitializePageMap(&PageMap, DeterminePagingLevel(Parameters->Parameters), Size4K);
|
XtLdrProtocol->Memory.InitializePageMap(&PageMap, DeterminePagingLevel(Parameters->Parameters), Size4K);
|
||||||
|
|
||||||
Status = XtLdrProtocol->Memory.MapEfiMemory(&PageMap, &VirtualMemoryArea, NULLPTR);
|
/* Map all EFI memory regions */
|
||||||
|
Status = XtLdrProtocol->Memory.MapEfiMemory(&PageMap, &VirtualAddress, IdentityMapping, NULLPTR);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
|
/* Mapping failed */
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check mapping strategy */
|
||||||
|
if(IdentityMapping)
|
||||||
|
{
|
||||||
|
/* Adjust virtual address to skip the identity-mapped physical range */
|
||||||
|
VirtualAddress = (PVOID)((ULONGLONG)VirtualAddress + 0x800000000);
|
||||||
|
}
|
||||||
|
|
||||||
/* Load the kernel */
|
/* Load the kernel */
|
||||||
Status = LoadModule(BootDir, Parameters->KernelFile, VirtualAddress, LoaderSystemCode, &ImageContext);
|
Status = LoadModule(BootDir, Parameters->KernelFile, VirtualAddress, LoaderSystemCode, &ImageContext);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
@@ -661,9 +700,9 @@ Xtos::RunBootSequence(IN PEFI_FILE_HANDLE BootDir,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Add kernel image memory mapping */
|
/* Add kernel image memory mapping */
|
||||||
Status = XtLdrProtocol->Memory.MapVirtualMemory(&PageMap, ImageContext->VirtualAddress,
|
Status = XtLdrProtocol->Memory.MapVirtualMemory(&PageMap, (ULONGLONG)ImageContext->VirtualAddress,
|
||||||
ImageContext->PhysicalAddress, ImageContext->ImagePages,
|
(ULONGLONG)ImageContext->PhysicalAddress, ImageContext->ImagePages,
|
||||||
LoaderExceptionBlock); // 0 is LoaderExceptionBlock?! Should be LoaderSystemCode?
|
LoaderSystemCode);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
return Status;
|
return Status;
|
||||||
@@ -681,6 +720,14 @@ Xtos::RunBootSequence(IN PEFI_FILE_HANDLE BootDir,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Build page map */
|
||||||
|
Status = BuildPageMap(&PageMap);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
XtLdrProtocol->Debug.Print(L"Failed to build page map (Status code: %zX)\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* Store virtual address of kernel initialization block for future kernel call */
|
/* Store virtual address of kernel initialization block for future kernel call */
|
||||||
KernelParameters = (PKERNEL_INITIALIZATION_BLOCK)VirtualAddress;
|
KernelParameters = (PKERNEL_INITIALIZATION_BLOCK)VirtualAddress;
|
||||||
|
|
||||||
@@ -1054,6 +1054,7 @@ Protocol::InstallXtLoaderProtocol()
|
|||||||
LoaderProtocol.Memory.AllocatePages = Memory::AllocatePages;
|
LoaderProtocol.Memory.AllocatePages = Memory::AllocatePages;
|
||||||
LoaderProtocol.Memory.AllocatePool = Memory::AllocatePool;
|
LoaderProtocol.Memory.AllocatePool = Memory::AllocatePool;
|
||||||
LoaderProtocol.Memory.BuildPageMap = Memory::BuildPageMap;
|
LoaderProtocol.Memory.BuildPageMap = Memory::BuildPageMap;
|
||||||
|
LoaderProtocol.Memory.CommitPageMap = Memory::CommitPageMap;
|
||||||
LoaderProtocol.Memory.CompareMemory = RTL::Memory::CompareMemory;
|
LoaderProtocol.Memory.CompareMemory = RTL::Memory::CompareMemory;
|
||||||
LoaderProtocol.Memory.CopyMemory = RTL::Memory::CopyMemory;
|
LoaderProtocol.Memory.CopyMemory = RTL::Memory::CopyMemory;
|
||||||
LoaderProtocol.Memory.FreePages = Memory::FreePages;
|
LoaderProtocol.Memory.FreePages = Memory::FreePages;
|
||||||
@@ -9,6 +9,13 @@
|
|||||||
#include <xtldr.hh>
|
#include <xtldr.hh>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disables access to EFI Boot Services.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
XTCDECL
|
XTCDECL
|
||||||
VOID
|
VOID
|
||||||
XtLoader::DisableBootServices()
|
XtLoader::DisableBootServices()
|
||||||
@@ -17,6 +24,13 @@ XtLoader::DisableBootServices()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Queries the availability of EFI Boot Services.
|
||||||
|
*
|
||||||
|
* @return This routine returns TRUE if EFI Boot Services are available, FALSE otherwise.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
XTCDECL
|
XTCDECL
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
XtLoader::GetBootServicesStatus()
|
XtLoader::GetBootServicesStatus()
|
||||||
@@ -24,6 +38,13 @@ XtLoader::GetBootServicesStatus()
|
|||||||
return LoaderStatus.BootServices;
|
return LoaderStatus.BootServices;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the EFI image handle.
|
||||||
|
*
|
||||||
|
* @return This routine returns a handle to the EFI-loaded image.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_HANDLE
|
EFI_HANDLE
|
||||||
XtLoader::GetEfiImageHandle()
|
XtLoader::GetEfiImageHandle()
|
||||||
@@ -31,6 +52,13 @@ XtLoader::GetEfiImageHandle()
|
|||||||
return XtLoader::EfiImageHandle;
|
return XtLoader::EfiImageHandle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the EFI system table pointer.
|
||||||
|
*
|
||||||
|
* @return This routine returns a pointer to the EFI system table.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
XTCDECL
|
XTCDECL
|
||||||
PEFI_SYSTEM_TABLE
|
PEFI_SYSTEM_TABLE
|
||||||
XtLoader::GetEfiSystemTable()
|
XtLoader::GetEfiSystemTable()
|
||||||
@@ -38,6 +66,19 @@ XtLoader::GetEfiSystemTable()
|
|||||||
return XtLoader::EfiSystemTable;
|
return XtLoader::EfiSystemTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides base address and size of the XTLDR image.
|
||||||
|
*
|
||||||
|
* @param LoaderBase
|
||||||
|
* Supplies a pointer to a variable that receives the base address of the XTLDR image.
|
||||||
|
*
|
||||||
|
* @param LoaderSize
|
||||||
|
* Supplies a pointer to a variable that receives the size of the XTLDR image.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
XTCDECL
|
XTCDECL
|
||||||
VOID
|
VOID
|
||||||
XtLoader::GetLoaderImageInformation(PVOID *LoaderBase,
|
XtLoader::GetLoaderImageInformation(PVOID *LoaderBase,
|
||||||
@@ -47,6 +88,13 @@ XtLoader::GetLoaderImageInformation(PVOID *LoaderBase,
|
|||||||
*LoaderSize = XtLoader::LoaderStatus.LoaderSize;
|
*LoaderSize = XtLoader::LoaderStatus.LoaderSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the Secure Boot status.
|
||||||
|
*
|
||||||
|
* @return This routine returns SecureBoot status.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
XTCDECL
|
XTCDECL
|
||||||
INT_PTR
|
INT_PTR
|
||||||
XtLoader::GetSecureBootStatus()
|
XtLoader::GetSecureBootStatus()
|
||||||
@@ -143,6 +191,13 @@ XtLoader::RegisterBootMenu(IN PVOID BootMenuRoutine)
|
|||||||
BootMenu = (PBL_XT_BOOT_MENU)BootMenuRoutine;
|
BootMenu = (PBL_XT_BOOT_MENU)BootMenuRoutine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invokes either a custom boot menu handler, if one has been registered, or displays the default boot menu.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
XTCDECL
|
XTCDECL
|
||||||
VOID
|
VOID
|
||||||
XtLoader::ShowBootMenu()
|
XtLoader::ShowBootMenu()
|
||||||
@@ -181,6 +236,15 @@ BlStartXtLoader(IN EFI_HANDLE ImageHandle,
|
|||||||
PWCHAR Modules;
|
PWCHAR Modules;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
/* Check if system is EFI-based and provided parameters are valid */
|
||||||
|
if(ImageHandle == NULLPTR || SystemTable == NULLPTR)
|
||||||
|
{
|
||||||
|
/* Invalid parameters, print error message using BIOS calls and hang */
|
||||||
|
BiosUtils::ClearScreen();
|
||||||
|
BiosUtils::Print(L"XTLDR requires EFI-based system!");
|
||||||
|
for(;;);
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize XTLDR and */
|
/* Initialize XTLDR and */
|
||||||
XtLoader::InitializeBootLoader(ImageHandle, SystemTable);
|
XtLoader::InitializeBootLoader(ImageHandle, SystemTable);
|
||||||
|
|
||||||
@@ -4,48 +4,41 @@
|
|||||||
# DESCRIPTION: Project configuration script for preparing the build environment
|
# DESCRIPTION: Project configuration script for preparing the build environment
|
||||||
# DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
# DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||||
|
|
||||||
|
|
||||||
# Check XTchain
|
# Check XTchain
|
||||||
if (-not $env:XTCVER) {
|
if (-not $env:XTCVER) {
|
||||||
Write-Host "XTChain not detected or corrupted!"
|
Write-Error "XTChain not detected or corrupted!"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# Set target architecture
|
# Set target architecture defaulting to amd64
|
||||||
if ($env:TARGET) {
|
$ARCH = if ($env:TARGET) { $env:TARGET } else { "amd64" }
|
||||||
$ARCH = $env:TARGET
|
|
||||||
} else {
|
|
||||||
$ARCH = "amd64"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Set target build type
|
# Set target build type defaulting to Debug
|
||||||
if (-not $env:BUILD_TYPE) {
|
$env:BUILD_TYPE = if ($env:BUILD_TYPE -in @("Debug", "Release")) { $env:BUILD_TYPE } else { "Debug" }
|
||||||
$env:BUILD_TYPE = "DEBUG"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Set variables
|
# Set variables
|
||||||
$EXECTOS_SOURCE_DIR = (Get-Location).Path
|
$EXECTOS_SOURCE_DIR = $PSScriptRoot
|
||||||
$EXECTOS_BINARY_DIR = "build-$($ARCH)-$($env:BUILD_TYPE.ToLower())"
|
$EXECTOS_BINARY_DIR = Join-Path $EXECTOS_SOURCE_DIR "build-$ARCH-$($env:BUILD_TYPE.ToLower())"
|
||||||
|
|
||||||
# Create directories if needed
|
# Create build directory
|
||||||
if ($EXECTOS_SOURCE_DIR -eq (Get-Location).Path) {
|
if (-not (Test-Path $EXECTOS_BINARY_DIR)) {
|
||||||
Write-Host "Creating directories in $EXECTOS_BINARY_DIR"
|
Write-Host "Creating build directory: $EXECTOS_BINARY_DIR"
|
||||||
New-Item -ItemType Directory -Path $EXECTOS_BINARY_DIR -Force | Out-Null
|
New-Item -ItemType Directory -Path $EXECTOS_BINARY_DIR -Force | Out-Null
|
||||||
Set-Location -Path $EXECTOS_BINARY_DIR
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Set-Location $EXECTOS_BINARY_DIR
|
||||||
|
|
||||||
# Delete old cache
|
# Delete old cache
|
||||||
Remove-Item -Path "CMakeCache.txt" -ErrorAction SilentlyContinue
|
Remove-Item "CMakeCache.txt", "host-tools/CMakeCache.txt" -ErrorAction SilentlyContinue
|
||||||
Remove-Item -Path "host-tools/CMakeCache.txt" -ErrorAction SilentlyContinue
|
|
||||||
|
|
||||||
# Configure project using CMake
|
# Configure project using CMake
|
||||||
& cmake -G Ninja -DARCH:STRING=$($ARCH) -DBUILD_TYPE:STRING=$($env:BUILD_TYPE) $EXECTOS_SOURCE_DIR
|
& cmake -G Ninja "-DARCH:STRING=$ARCH" "-DBUILD_TYPE:STRING=$($env:BUILD_TYPE)" $EXECTOS_SOURCE_DIR
|
||||||
|
|
||||||
# Check if configuration succeeded
|
# Check if configuration succeeded
|
||||||
if ($LASTEXITCODE -ne 0) {
|
if ($LASTEXITCODE -ne 0) {
|
||||||
Write-Host "Configure script failed."
|
Write-Error "Configure script failed."
|
||||||
exit 1
|
exit 1
|
||||||
} else {
|
|
||||||
"$($ARCH)" | Out-File -Encoding ASCII -NoNewline build.arch
|
|
||||||
Write-Host "Configure script completed. Enter '$EXECTOS_BINARY_DIR' directory and execute 'xbuild' to build ExectOS."
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$ARCH | Out-File -Encoding ASCII -NoNewline "build.arch"
|
||||||
|
Write-Host "Configure completed. Run 'xbuild' to build ExectOS."
|
||||||
@@ -1 +1,3 @@
|
|||||||
|
add_subdirectory("xtadk")
|
||||||
|
|
||||||
set_sdk_target("xtdk/" "include")
|
set_sdk_target("xtdk/" "include")
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
# Set base addresses for all modules
|
# Set base addresses for all modules
|
||||||
|
set(BASEADDRESS_XTLDR 0x000000000000F800)
|
||||||
set(BASEADDRESS_XTOSKRNL 0x0000000140000000)
|
set(BASEADDRESS_XTOSKRNL 0x0000000140000000)
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
# Set base addresses for all modules
|
# Set base addresses for all modules
|
||||||
|
set(BASEADDRESS_XTLDR 0x0000F800)
|
||||||
set(BASEADDRESS_XTOSKRNL 0x00400000)
|
set(BASEADDRESS_XTOSKRNL 0x00400000)
|
||||||
|
|||||||
@@ -8,41 +8,79 @@ endif()
|
|||||||
# This target creates a disk image
|
# This target creates a disk image
|
||||||
add_custom_target(diskimg
|
add_custom_target(diskimg
|
||||||
DEPENDS install
|
DEPENDS install
|
||||||
COMMAND sh -c "dd if=/dev/zero of=${EXECTOS_BINARY_DIR}/output/disk.img bs=512 count=${PROJECT_DISK_IMAGE_BLOCKS} 2>/dev/null 1>/dev/null"
|
COMMAND diskimg -c ${EXECTOS_BINARY_DIR}/output/binaries -f 32 -o ${EXECTOS_BINARY_DIR}/output/disk.img -s ${PROJECT_DISK_IMAGE_SIZE}
|
||||||
COMMAND parted ${EXECTOS_BINARY_DIR}/output/disk.img -s -a minimal mklabel gpt
|
-m ${EXECTOS_BINARY_DIR}/boot/bootsect/mbrboot.bin -v ${EXECTOS_BINARY_DIR}/boot/bootsect/espboot.bin
|
||||||
COMMAND parted ${EXECTOS_BINARY_DIR}/output/disk.img -s -a minimal mkpart EFI FAT32 2048s ${PROJECT_PART_IMAGE_BLOCKS}s
|
|
||||||
COMMAND parted ${EXECTOS_BINARY_DIR}/output/disk.img -s -a minimal toggle 1 boot
|
|
||||||
COMMAND sh -c "dd if=/dev/zero of=${EXECTOS_BINARY_DIR}/output/part.img bs=512 count=${PROJECT_PART_IMAGE_BLOCKS} 2>/dev/null 1>/dev/null"
|
|
||||||
COMMAND mformat -i ${EXECTOS_BINARY_DIR}/output/part.img -h32 -t32 -n64 -L32
|
|
||||||
COMMAND sh -c "mcopy -s -i ${EXECTOS_BINARY_DIR}/output/part.img ${EXECTOS_BINARY_DIR}/output/binaries/* ::"
|
|
||||||
COMMAND sh -c "dd if=${EXECTOS_BINARY_DIR}/output/part.img of=${EXECTOS_BINARY_DIR}/output/disk.img bs=512 count=${PROJECT_PART_IMAGE_BLOCKS} seek=2048 conv=notrunc 2>/dev/null 1>/dev/null"
|
|
||||||
COMMAND rm ${EXECTOS_BINARY_DIR}/output/part.img
|
|
||||||
VERBATIM)
|
VERBATIM)
|
||||||
|
|
||||||
# This target starts up a BOCHS+OVMF virtual machine
|
find_program(BOCHS_EMULATOR bochs)
|
||||||
add_custom_target(bochsvm
|
if(BOCHS_EMULATOR)
|
||||||
DEPENDS diskimg
|
# This target starts up a BOCHS+BIOS virtual machine
|
||||||
COMMAND bochs -f ../sdk/firmware/bochsrc_${ARCH}.cfg -q -unlock
|
add_custom_target(bochsvm
|
||||||
VERBATIM USES_TERMINAL)
|
DEPENDS diskimg
|
||||||
|
COMMAND bochs -f ../sdk/firmware/bochsrc_${ARCH}.cfg -q -unlock
|
||||||
|
VERBATIM USES_TERMINAL)
|
||||||
|
endif()
|
||||||
|
|
||||||
# This target starts up a QEMU+OVMF virtual machine using KVM accelerator
|
find_program(QEMU_EMULATOR ${QEMU_COMMAND})
|
||||||
add_custom_target(testkvm
|
if(QEMU_EMULATOR)
|
||||||
DEPENDS install
|
if(CMAKE_HOST_LINUX)
|
||||||
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-KVM" -machine type=q35,kernel_irqchip=on,accel=kvm,mem-merge=off,vmport=off -enable-kvm -cpu host,-hypervisor,+topoext
|
# This target starts up a QEMU+OVMF virtual machine using KVM accelerator
|
||||||
-smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
|
add_custom_target(testefikvm
|
||||||
-drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_code_${ARCH}.fd,if=pflash,format=raw,unit=0,readonly=on
|
DEPENDS install
|
||||||
-drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_vars_${ARCH}.fd,if=pflash,format=raw,unit=1
|
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-EFI-KVM" -machine type=q35,kernel_irqchip=on,accel=kvm,mem-merge=off,vmport=off -enable-kvm -cpu host,-hypervisor,+topoext
|
||||||
-hda fat:rw:${EXECTOS_BINARY_DIR}/output/binaries
|
-smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
|
||||||
-boot menu=on -d int -M smm=off -no-reboot -no-shutdown -serial stdio
|
-bios ${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_${ARCH}.fd
|
||||||
VERBATIM USES_TERMINAL)
|
-hda fat:rw:${EXECTOS_BINARY_DIR}/output/binaries
|
||||||
|
-boot menu=on -d int -M smm=off -no-reboot -no-shutdown -serial stdio
|
||||||
|
VERBATIM USES_TERMINAL)
|
||||||
|
elseif(CMAKE_HOST_WIN32)
|
||||||
|
# This target starts up a QEMU+OVMF virtual machine using WHPX accelerator
|
||||||
|
add_custom_target(testefiwhpx
|
||||||
|
DEPENDS install
|
||||||
|
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-EFI-WHPX" -machine type=q35,kernel_irqchip=off,accel=whpx,mem-merge=off,vmport=off
|
||||||
|
-m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
|
||||||
|
-bios ${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_${ARCH}.fd
|
||||||
|
-hda fat:rw:${EXECTOS_BINARY_DIR}/output/binaries
|
||||||
|
-boot menu=on -d int -M smm=off -no-reboot -no-shutdown -serial stdio
|
||||||
|
VERBATIM USES_TERMINAL)
|
||||||
|
endif()
|
||||||
|
|
||||||
# This target starts up a QEMU+OVMF virtual machine using TCG accelerator
|
# This target starts up a QEMU+OVMF virtual machine using TCG accelerator
|
||||||
add_custom_target(testtcg
|
add_custom_target(testefitcg
|
||||||
DEPENDS install
|
DEPENDS install
|
||||||
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-TCG" -machine type=q35,accel=tcg -cpu max,-hypervisor
|
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-EFI-TCG" -machine type=q35,accel=tcg -cpu max,-hypervisor
|
||||||
-smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
|
-smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
|
||||||
-drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_code_${ARCH}.fd,if=pflash,format=raw,unit=0,readonly=on
|
-bios ${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_${ARCH}.fd
|
||||||
-drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_vars_${ARCH}.fd,if=pflash,format=raw,unit=1
|
-hda fat:rw:${EXECTOS_BINARY_DIR}/output/binaries
|
||||||
-hda fat:rw:${EXECTOS_BINARY_DIR}/output/binaries
|
-boot menu=on -d int -no-reboot -no-shutdown -serial stdio
|
||||||
-boot menu=on -d int -M smm=off -no-reboot -no-shutdown -serial stdio
|
VERBATIM USES_TERMINAL)
|
||||||
VERBATIM USES_TERMINAL)
|
|
||||||
|
if(CMAKE_HOST_LINUX)
|
||||||
|
# This target starts up a QEMU+SEABIOS virtual machine using KVM accelerator
|
||||||
|
add_custom_target(testkvm
|
||||||
|
DEPENDS diskimg
|
||||||
|
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-BIOS-KVM" -machine type=q35,kernel_irqchip=on,accel=kvm,mem-merge=off,vmport=off -enable-kvm -cpu host,-hypervisor,+topoext
|
||||||
|
-smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
|
||||||
|
-hda ${EXECTOS_BINARY_DIR}/output/disk.img
|
||||||
|
-boot menu=on -d int -no-reboot -no-shutdown -serial stdio
|
||||||
|
VERBATIM USES_TERMINAL)
|
||||||
|
elseif(CMAKE_HOST_WIN32)
|
||||||
|
# This target starts up a QEMU+SEABIOS virtual machine using WHPX accelerator
|
||||||
|
add_custom_target(testwhpx
|
||||||
|
DEPENDS diskimg
|
||||||
|
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-BIOS-WHPX" -machine type=q35,kernel_irqchip=off,accel=whpx,mem-merge=off,vmport=off
|
||||||
|
-m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
|
||||||
|
-hda ${EXECTOS_BINARY_DIR}/output/disk.img
|
||||||
|
-boot menu=on -d int -no-reboot -no-shutdown -serial stdio
|
||||||
|
VERBATIM USES_TERMINAL)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# This target starts up a QEMU+SEABIOS virtual machine using TCG accelerator
|
||||||
|
add_custom_target(testtcg
|
||||||
|
DEPENDS diskimg
|
||||||
|
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-BIOS-TCG" -machine type=q35,accel=tcg -cpu max,-hypervisor
|
||||||
|
-smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
|
||||||
|
-hda ${EXECTOS_BINARY_DIR}/output/disk.img
|
||||||
|
-boot menu=on -d int -no-reboot -no-shutdown -serial stdio
|
||||||
|
VERBATIM USES_TERMINAL)
|
||||||
|
endif()
|
||||||
|
|||||||
@@ -59,18 +59,128 @@ function(add_module_linker_flags MODULE FLAGS)
|
|||||||
set_module_property(${MODULE} LINK_FLAGS ${FLAGS})
|
set_module_property(${MODULE} LINK_FLAGS ${FLAGS})
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# This function sets a property for specified module
|
# This function compiles XT Assembly Development Kit
|
||||||
function(set_module_property MODULE PROPERTY FLAGS)
|
function(generate_xtadk TARGET_NAME SOURCE_FILES)
|
||||||
if(NOT ${ARGC} EQUAL 3)
|
# Define the absolute destination path for the generated header file
|
||||||
message(FATAL_ERROR "Invalid number of arguments passwd to add_module_property() function")
|
set(HEADER_OUTPUT "${EXECTOS_BINARY_DIR}/sdk/includes/${TARGET_NAME}.h")
|
||||||
|
get_filename_component(HEADER_OUTPUT_DIRECTORY "${HEADER_OUTPUT}" DIRECTORY)
|
||||||
|
|
||||||
|
# Tokenize global CXX flags into a list to ensure correct argument expansion
|
||||||
|
separate_arguments(COMPILER_FLAGS NATIVE_COMMAND "${CMAKE_CXX_FLAGS}")
|
||||||
|
|
||||||
|
# Resolve and tokenize build-configuration specific flags
|
||||||
|
string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE)
|
||||||
|
if(BUILD_TYPE)
|
||||||
|
separate_arguments(BUILD_TYPE_SPECIFIC_FLAGS NATIVE_COMMAND "${CMAKE_CXX_FLAGS_${BUILD_TYPE}}")
|
||||||
endif()
|
endif()
|
||||||
get_target_property(VAL ${MODULE} ${PROPERTY})
|
|
||||||
if(VAL)
|
# Retrieve compiler definitions, include paths, and options
|
||||||
set(VAL "${VAL} ${FLAGS}")
|
get_directory_property(COMPILE_DEFINITIONS COMPILE_DEFINITIONS)
|
||||||
else()
|
get_directory_property(INCLUDE_DIRECTORIES INCLUDE_DIRECTORIES)
|
||||||
set(VAL "${FLAGS}")
|
get_directory_property(COMPILE_OPTIONS COMPILE_OPTIONS)
|
||||||
endif()
|
|
||||||
set_property(TARGET ${MODULE} PROPERTY ${PROPERTY} ${VAL})
|
# Initialize the final compiler argument list
|
||||||
|
set(COMPILER_ARGUMENTS "")
|
||||||
|
list(APPEND COMPILER_ARGUMENTS ${COMPILER_FLAGS} ${BUILD_TYPE_SPECIFIC_FLAGS})
|
||||||
|
|
||||||
|
# Transform definitions into MSVC-style
|
||||||
|
foreach(DEFINITION ${COMPILE_DEFINITIONS})
|
||||||
|
list(APPEND COMPILER_ARGUMENTS "/D${DEFINITION}")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# Transform include paths into MSVC-style
|
||||||
|
foreach(INCLUDE_PATH ${INCLUDE_DIRECTORIES})
|
||||||
|
list(APPEND COMPILER_ARGUMENTS "/I${INCLUDE_PATH}")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# Append all supplemental compiler options
|
||||||
|
list(APPEND COMPILER_ARGUMENTS ${COMPILE_OPTIONS})
|
||||||
|
set(COLLECTED_ASSEMBLY_OUTPUTS "")
|
||||||
|
|
||||||
|
# Iterate through each source file to create individual assembly generation rules
|
||||||
|
foreach(SOURCE_FILE_PATH ${SOURCE_FILES})
|
||||||
|
# Extract the base filename
|
||||||
|
get_filename_component(FILENAME_WITHOUT_EXTENSION "${SOURCE_FILE_PATH}" NAME_WE)
|
||||||
|
|
||||||
|
# Define the unique output path for the intermediate assembly file
|
||||||
|
set(CURRENT_ASSEMBLY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FILENAME_WITHOUT_EXTENSION}.S")
|
||||||
|
list(APPEND COLLECTED_ASSEMBLY_OUTPUTS "${CURRENT_ASSEMBLY_OUTPUT}")
|
||||||
|
get_filename_component(CURRENT_ASSEMBLY_DIRECTORY "${CURRENT_ASSEMBLY_OUTPUT}" DIRECTORY)
|
||||||
|
|
||||||
|
# Execute the compiler to generate assembly code
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT "${CURRENT_ASSEMBLY_OUTPUT}"
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E make_directory "${CURRENT_ASSEMBLY_DIRECTORY}"
|
||||||
|
COMMAND ${CMAKE_CXX_COMPILER}
|
||||||
|
${COMPILER_ARGUMENTS}
|
||||||
|
/c /FAs /Fa${CURRENT_ASSEMBLY_OUTPUT}
|
||||||
|
-- ${SOURCE_FILE_PATH}
|
||||||
|
DEPENDS "${SOURCE_FILE_PATH}"
|
||||||
|
COMMENT "Generating XTADK Assembly: ${FILENAME_WITHOUT_EXTENSION}"
|
||||||
|
VERBATIM
|
||||||
|
COMMAND_EXPAND_LISTS
|
||||||
|
)
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# Aggregate all generated assembly units into a single consolidated XTADK header
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT "${HEADER_OUTPUT}"
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E make_directory "${HEADER_OUTPUT_DIRECTORY}"
|
||||||
|
COMMAND xtadkgen ${COLLECTED_ASSEMBLY_OUTPUTS} -O "${HEADER_OUTPUT}"
|
||||||
|
DEPENDS ${COLLECTED_ASSEMBLY_OUTPUTS}
|
||||||
|
COMMENT "Generating XTADK header: ${TARGET_NAME}"
|
||||||
|
VERBATIM
|
||||||
|
)
|
||||||
|
|
||||||
|
# Establish the generation target and expose the header directory via an interface library
|
||||||
|
add_custom_target(${TARGET_NAME}_gen DEPENDS "${HEADER_OUTPUT}")
|
||||||
|
add_library(${TARGET_NAME} INTERFACE)
|
||||||
|
add_dependencies(${TARGET_NAME} ${TARGET_NAME}_gen)
|
||||||
|
target_include_directories(${TARGET_NAME} INTERFACE "${EXECTOS_BINARY_DIR}/sdk/includes")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# This function compiles an assembly bootsector file into a flat binary
|
||||||
|
function(compile_bootsector NAME SOURCE BASEADDR ENTRYPOINT)
|
||||||
|
set(BINARY_NAME "${NAME}.bin")
|
||||||
|
set(OBJECT_NAME "${NAME}.obj")
|
||||||
|
|
||||||
|
get_directory_property(DEFS COMPILE_DEFINITIONS)
|
||||||
|
foreach(def ${DEFS})
|
||||||
|
list(APPEND ASM_DEFS "-D${def}")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}
|
||||||
|
COMMAND ${CMAKE_ASM_COMPILER}
|
||||||
|
/nologo
|
||||||
|
--target=i386-none-elf
|
||||||
|
${ASM_DEFS}
|
||||||
|
-I${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
/Fo${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_NAME}
|
||||||
|
-c -- ${SOURCE}
|
||||||
|
COMMAND ${CMAKE_ASM_LINKER}
|
||||||
|
-m elf_i386
|
||||||
|
--image-base=0
|
||||||
|
--oformat binary
|
||||||
|
-Ttext=${BASEADDR}
|
||||||
|
--entry=_start${ENTRYPOINT}
|
||||||
|
-o ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_NAME}
|
||||||
|
DEPENDS ${SOURCE}
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_target(${NAME} ALL
|
||||||
|
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}
|
||||||
|
)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# This function sets the the qemu disk image size (in MiB)
|
||||||
|
function(set_disk_image_size SIZE)
|
||||||
|
MATH(EXPR DISK_BLOCKS ${SIZE}*1024*1024/512)
|
||||||
|
MATH(EXPR PART_BLOCKS ${DISK_BLOCKS}-2048)
|
||||||
|
set(PROJECT_DISK_IMAGE_SIZE ${SIZE} CACHE INTERNAL "PROJECT_DISK_IMAGE_SIZE")
|
||||||
|
set(PROJECT_DISK_IMAGE_BLOCKS ${DISK_BLOCKS} CACHE INTERNAL "PROJECT_DISK_IMAGE_BLOCKS")
|
||||||
|
set(PROJECT_PART_IMAGE_BLOCKS ${PART_BLOCKS} CACHE INTERNAL "PROJECT_PART_IMAGE_BLOCKS")
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# This function installs specified directory recursively under destination directory
|
# This function installs specified directory recursively under destination directory
|
||||||
@@ -89,6 +199,20 @@ function(set_install_target TARGET DESTINATION)
|
|||||||
install(TARGETS ${TARGET} DESTINATION ${EXECTOS_BINARY_DIR}/output/binaries/${DESTINATION})
|
install(TARGETS ${TARGET} DESTINATION ${EXECTOS_BINARY_DIR}/output/binaries/${DESTINATION})
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
# This function sets a property for specified module
|
||||||
|
function(set_module_property MODULE PROPERTY FLAGS)
|
||||||
|
if(NOT ${ARGC} EQUAL 3)
|
||||||
|
message(FATAL_ERROR "Invalid number of arguments passwd to add_module_property() function")
|
||||||
|
endif()
|
||||||
|
get_target_property(VAL ${MODULE} ${PROPERTY})
|
||||||
|
if(VAL)
|
||||||
|
set(VAL "${VAL} ${FLAGS}")
|
||||||
|
else()
|
||||||
|
set(VAL "${FLAGS}")
|
||||||
|
endif()
|
||||||
|
set_property(TARGET ${MODULE} PROPERTY ${PROPERTY} ${VAL})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
function(set_sdk_target FILENAME DESTINATION)
|
function(set_sdk_target FILENAME DESTINATION)
|
||||||
install(DIRECTORY ${FILENAME} DESTINATION ${EXECTOS_BINARY_DIR}/output/sdk/${DESTINATION})
|
install(DIRECTORY ${FILENAME} DESTINATION ${EXECTOS_BINARY_DIR}/output/sdk/${DESTINATION})
|
||||||
endfunction()
|
endfunction()
|
||||||
@@ -102,11 +226,3 @@ function(set_specfile SPECFILE EXPORTNAME)
|
|||||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.def ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.c
|
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.def ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.c
|
||||||
COMMAND ${CMAKE_SPEC_COMPILER} -a=${ARCH} -n=${EXPORTNAME} -d=${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.def -s=${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.c ${CMAKE_CURRENT_SOURCE_DIR}/${SPECFILE})
|
COMMAND ${CMAKE_SPEC_COMPILER} -a=${ARCH} -n=${EXPORTNAME} -d=${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.def -s=${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.c ${CMAKE_CURRENT_SOURCE_DIR}/${SPECFILE})
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# This function sets the the qemu disk image size (in MiB)
|
|
||||||
function(set_disk_image_size SIZE)
|
|
||||||
MATH(EXPR DISK_BLOCKS ${SIZE}*1024*1024/512)
|
|
||||||
MATH(EXPR PART_BLOCKS ${DISK_BLOCKS}-2048)
|
|
||||||
set(PROJECT_DISK_IMAGE_BLOCKS ${DISK_BLOCKS} CACHE INTERNAL "PROJECT_DISK_IMAGE_BLOCKS")
|
|
||||||
set(PROJECT_PART_IMAGE_BLOCKS ${PART_BLOCKS} CACHE INTERNAL "PROJECT_PART_IMAGE_BLOCKS")
|
|
||||||
endfunction()
|
|
||||||
|
|||||||
@@ -3,8 +3,10 @@ set(CMAKE_SYSTEM_NAME Windows)
|
|||||||
|
|
||||||
# Set toolchain compilers
|
# Set toolchain compilers
|
||||||
set(CMAKE_ASM_COMPILER clang-cl)
|
set(CMAKE_ASM_COMPILER clang-cl)
|
||||||
|
set(CMAKE_ASM_LINKER ld.lld)
|
||||||
set(CMAKE_C_COMPILER clang-cl)
|
set(CMAKE_C_COMPILER clang-cl)
|
||||||
set(CMAKE_CXX_COMPILER clang-cl)
|
set(CMAKE_CXX_COMPILER clang-cl)
|
||||||
|
set(CMAKE_LINKER lld-link)
|
||||||
set(CMAKE_MC_COMPILER wmc)
|
set(CMAKE_MC_COMPILER wmc)
|
||||||
set(CMAKE_RC_COMPILER wrc)
|
set(CMAKE_RC_COMPILER wrc)
|
||||||
set(CMAKE_SPEC_COMPILER xtcspecc)
|
set(CMAKE_SPEC_COMPILER xtcspecc)
|
||||||
|
|||||||
@@ -13,6 +13,10 @@ The ovmf_vars files, store UEFI variables, which are used to store and retrieve
|
|||||||
boot options, device settings, and system preferences. The ovmf_vars file contains the persistent variables specific to
|
boot options, device settings, and system preferences. The ovmf_vars file contains the persistent variables specific to
|
||||||
a virtual machine, allowing it to maintain its configuration across multiple boot sessions.
|
a virtual machine, allowing it to maintain its configuration across multiple boot sessions.
|
||||||
|
|
||||||
|
## BOCHS ROM BIOS
|
||||||
|
The rombios.bin file contains the ROM BIOS image for Bochs. This image is distributed under the GNU Lesser General Public
|
||||||
|
License (LGPL).
|
||||||
|
|
||||||
## Video BIOS (LGPL'd VGABios)
|
## Video BIOS (LGPL'd VGABios)
|
||||||
The vgabios.bin file contains the Video Bios for Bochs and QEMU. This VGA Bios is very specific to the emulated VGA card.
|
The vgabios.bin file contains the Video Bios for Bochs and QEMU. This VGA Bios is very specific to the emulated VGA card.
|
||||||
It is NOT meant to drive a physical vga card. It also implements support for VBE version 2.0.
|
It is NOT meant to drive a physical vga card. It also implements support for VBE version 2.0.
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ plugin_ctrl: usb_xhci=false, serial=true, e1000=false, extfpuirq=true, parallel=
|
|||||||
config_interface: textconfig
|
config_interface: textconfig
|
||||||
display_library: x
|
display_library: x
|
||||||
memory: host=64, guest=64
|
memory: host=64, guest=64
|
||||||
romimage: file="../sdk/firmware/ovmf_pure_amd64.fd", address=0x00000000, options=none
|
romimage: file="../sdk/firmware/rombios.bin", address=0x00000000, options=none
|
||||||
vgaromimage: file="../sdk/firmware/vgabios.bin"
|
vgaromimage: file="../sdk/firmware/vgabios.bin"
|
||||||
boot: floppy
|
boot: disk
|
||||||
floppy_bootsig_check: disabled=0
|
floppy_bootsig_check: disabled=0
|
||||||
floppya: type=1_44
|
floppya: type=1_44
|
||||||
# no floppyb
|
# no floppyb
|
||||||
@@ -27,11 +27,7 @@ optramimage3: file=none
|
|||||||
optramimage4: file=none
|
optramimage4: file=none
|
||||||
pci: enabled=1, chipset=i440fx, slot1=cirrus, slot2=none, slot3=none, slot4=none, slot5=none
|
pci: enabled=1, chipset=i440fx, slot1=cirrus, slot2=none, slot3=none, slot4=none, slot5=none
|
||||||
vga: extension=cirrus, update_freq=5, realtime=1, ddc=builtin
|
vga: extension=cirrus, update_freq=5, realtime=1, ddc=builtin
|
||||||
cpu: count=1:1:1, ips=400000000, quantum=16, model=bx_generic, reset_on_triple_fault=0, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0
|
cpu: count=1:1:1, ips=400000000, quantum=16, model=corei7_sandy_bridge_2600k, reset_on_triple_fault=0, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0
|
||||||
cpuid: level=6, stepping=3, model=3, family=6, vendor_string="GenuineIntel", brand_string=" Intel(R) Pentium(R) 4 CPU "
|
|
||||||
cpuid: mmx=true, apic=xapic, simd=sse4_2, sse4a=false, misaligned_sse=false, sep=true
|
|
||||||
cpuid: movbe=false, adx=false, aes=false, sha=false, xsave=false, xsaveopt=false, x86_64=true
|
|
||||||
cpuid: 1g_pages=false, pcid=false, fsgsbase=false, smep=false, smap=false, mwait=true
|
|
||||||
print_timestamps: enabled=0
|
print_timestamps: enabled=0
|
||||||
port_e9_hack: enabled=0
|
port_e9_hack: enabled=0
|
||||||
private_colormap: enabled=0
|
private_colormap: enabled=0
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ plugin_ctrl: usb_xhci=false, serial=true, e1000=false, extfpuirq=true, parallel=
|
|||||||
config_interface: textconfig
|
config_interface: textconfig
|
||||||
display_library: x
|
display_library: x
|
||||||
memory: host=64, guest=64
|
memory: host=64, guest=64
|
||||||
romimage: file="../sdk/firmware/ovmf_pure_i686.fd", address=0x00000000, options=none
|
romimage: file="../sdk/firmware/rombios.bin", address=0x00000000, options=none
|
||||||
vgaromimage: file="../sdk/firmware/vgabios.bin"
|
vgaromimage: file="../sdk/firmware/vgabios.bin"
|
||||||
boot: floppy
|
boot: disk
|
||||||
floppy_bootsig_check: disabled=0
|
floppy_bootsig_check: disabled=0
|
||||||
floppya: type=1_44
|
floppya: type=1_44
|
||||||
# no floppyb
|
# no floppyb
|
||||||
@@ -27,11 +27,7 @@ optramimage3: file=none
|
|||||||
optramimage4: file=none
|
optramimage4: file=none
|
||||||
pci: enabled=1, chipset=i440fx, slot1=cirrus, slot2=none, slot3=none, slot4=none, slot5=none
|
pci: enabled=1, chipset=i440fx, slot1=cirrus, slot2=none, slot3=none, slot4=none, slot5=none
|
||||||
vga: extension=cirrus, update_freq=5, realtime=1, ddc=builtin
|
vga: extension=cirrus, update_freq=5, realtime=1, ddc=builtin
|
||||||
cpu: count=1:1:1, ips=400000000, quantum=16, model=bx_generic, reset_on_triple_fault=0, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0
|
cpu: count=1:1:1, ips=400000000, quantum=16, model=corei7_sandy_bridge_2600k, reset_on_triple_fault=0, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0
|
||||||
cpuid: level=6, stepping=3, model=3, family=6, vendor_string="GenuineIntel", brand_string=" Intel(R) Pentium(R) 4 CPU "
|
|
||||||
cpuid: mmx=true, apic=xapic, simd=sse4_2, sse4a=false, misaligned_sse=false, sep=true
|
|
||||||
cpuid: movbe=false, adx=false, aes=false, sha=false, xsave=false, xsaveopt=false, x86_64=true
|
|
||||||
cpuid: 1g_pages=false, pcid=false, fsgsbase=false, smep=false, smap=false, mwait=true
|
|
||||||
print_timestamps: enabled=0
|
print_timestamps: enabled=0
|
||||||
port_e9_hack: enabled=0
|
port_e9_hack: enabled=0
|
||||||
private_colormap: enabled=0
|
private_colormap: enabled=0
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
sdk/firmware/rombios.bin
Normal file
BIN
sdk/firmware/rombios.bin
Normal file
Binary file not shown.
14
sdk/xtadk/CMakeLists.txt
Normal file
14
sdk/xtadk/CMakeLists.txt
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# XT Assembly Development Kit
|
||||||
|
PROJECT(XTADK)
|
||||||
|
|
||||||
|
# Specify include directories
|
||||||
|
include_directories(
|
||||||
|
${EXECTOS_SOURCE_DIR}/sdk/xtdk
|
||||||
|
${XTADK_SOURCE_DIR}/includes)
|
||||||
|
|
||||||
|
# Specify list of XTADK source code files
|
||||||
|
list(APPEND XTADK_SOURCE
|
||||||
|
${XTADK_SOURCE_DIR}/${ARCH}/ke.cc)
|
||||||
|
|
||||||
|
# Generate assembly header from XTADK sources
|
||||||
|
generate_xtadk(xtadk "${XTADK_SOURCE}")
|
||||||
83
sdk/xtadk/amd64/ke.cc
Normal file
83
sdk/xtadk/amd64/ke.cc
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
/**
|
||||||
|
* PROJECT: ExectOS
|
||||||
|
* COPYRIGHT: See COPYING.md in the top level directory
|
||||||
|
* FILE: sdk/xtadk/amd64/ke.cc
|
||||||
|
* DESCRIPTION: ADK generator for AMD64 version of Kernel Library
|
||||||
|
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xtkmapi.h>
|
||||||
|
#include <adkdefs.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a definitions file for the Kernel Library used by the XTOS kernel assembly code
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCLINK
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
GenerateAssemblyDefinitions(VOID)
|
||||||
|
{
|
||||||
|
/* Generate KTRAP_FRAME offsets */
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm0);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm1);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm2);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm3);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm4);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm5);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm6);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm7);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm8);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm9);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm10);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm11);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm12);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm13);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm14);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Xmm15);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, MxCsr);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, PreviousMode);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Cr2);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Cr3);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Dr0);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Dr1);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Dr2);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Dr3);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Dr6);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Dr7);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, SegDs);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, SegEs);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, SegFs);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, SegGs);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Rax);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Rbx);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Rcx);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Rdx);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, R8);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, R9);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, R10);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, R11);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, R12);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, R13);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, R14);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, R15);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Rsi);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Rdi);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Rbp);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Vector);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, ErrorCode);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, ExceptionFrame);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Rip);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, SegCs);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Flags);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Rsp);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, SegSs);
|
||||||
|
|
||||||
|
/* Generate KTRAP_FRAME size and REGISTERS_SIZE */
|
||||||
|
ADK_SIZE(KTRAP_FRAME);
|
||||||
|
ADK_SIZE_FROM(REGISTERS_SIZE, KTRAP_FRAME, Rax);
|
||||||
|
}
|
||||||
57
sdk/xtadk/i686/ke.cc
Normal file
57
sdk/xtadk/i686/ke.cc
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/**
|
||||||
|
* PROJECT: ExectOS
|
||||||
|
* COPYRIGHT: See COPYING.md in the top level directory
|
||||||
|
* FILE: sdk/xtadk/i686/ke.cc
|
||||||
|
* DESCRIPTION: ADK generator for i686 version of Kernel Library
|
||||||
|
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xtkmapi.h>
|
||||||
|
#include <adkdefs.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a definitions file for the Kernel Library used by the XTOS kernel assembly code
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCLINK
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
GenerateAssemblyDefinitions(VOID)
|
||||||
|
{
|
||||||
|
/* Generate KTRAP_FRAME offsets */
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, PreviousMode);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Cr2);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Cr3);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Dr0);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Dr1);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Dr2);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Dr3);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Dr6);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Dr7);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, SegDs);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, SegEs);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, SegFs);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, SegGs);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Eax);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Ebx);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Ecx);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Edx);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Esi);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Edi);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Ebp);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Vector);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, ErrorCode);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Eip);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, SegCs);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Flags);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, Esp);
|
||||||
|
ADK_OFFSET(KTRAP_FRAME, SegSs);
|
||||||
|
|
||||||
|
/* Generate KTRAP_FRAME size and REGISTERS_SIZE */
|
||||||
|
ADK_SIZE(KTRAP_FRAME);
|
||||||
|
ADK_SIZE_FROM(REGISTERS_SIZE, KTRAP_FRAME, Eax);
|
||||||
|
}
|
||||||
19
sdk/xtadk/includes/adkdefs.h
Normal file
19
sdk/xtadk/includes/adkdefs.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* PROJECT: ExectOS
|
||||||
|
* COPYRIGHT: See COPYING.md in the top level directory
|
||||||
|
* FILE: sdk/xtadk/adkdefs.h
|
||||||
|
* DESCRIPTION: Definitions for XTADK
|
||||||
|
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __XTADK_ADKDEFS_H
|
||||||
|
#define __XTADK_ADKDEFS_H
|
||||||
|
|
||||||
|
|
||||||
|
/* Macros for calculating structure size and offsets for assembler code */
|
||||||
|
#define ADK_DEFINE(Symbol, Value) __asm__ volatile("\n\t# ==> " #Symbol " %c0" : : "i" ((SIZE_T)(Value)))
|
||||||
|
#define ADK_OFFSET(Structure, Member) ADK_DEFINE(Structure ## _ ## Member, FIELD_OFFSET(Structure, Member))
|
||||||
|
#define ADK_SIZE(Structure) ADK_DEFINE(Structure ## _SIZE, sizeof(Structure))
|
||||||
|
#define ADK_SIZE_FROM(Name, Structure, Member) ADK_DEFINE(Structure ## _ ## Name, sizeof(Structure) - FIELD_OFFSET(Structure, Member))
|
||||||
|
|
||||||
|
#endif /* __XTADK_ADKDEFS_H */
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <xtdefs.h>
|
#include <xtdefs.h>
|
||||||
#include <xtstruct.h>
|
#include <xtstruct.h>
|
||||||
#include <xttypes.h>
|
#include <xttypes.h>
|
||||||
|
#include ARCH_HEADER(xtstruct.h)
|
||||||
|
|
||||||
|
|
||||||
/* Control Register 0 constants */
|
/* Control Register 0 constants */
|
||||||
@@ -127,6 +128,10 @@
|
|||||||
#define X86_EFLAGS_VIP_MASK 0x00100000 /* Virtual Interrupt Pending */
|
#define X86_EFLAGS_VIP_MASK 0x00100000 /* Virtual Interrupt Pending */
|
||||||
#define X86_EFLAGS_ID_MASK 0x00200000 /* Identification */
|
#define X86_EFLAGS_ID_MASK 0x00200000 /* Identification */
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* CPU vendor enumeration list */
|
/* CPU vendor enumeration list */
|
||||||
typedef enum _CPU_VENDOR
|
typedef enum _CPU_VENDOR
|
||||||
{
|
{
|
||||||
@@ -135,6 +140,18 @@ typedef enum _CPU_VENDOR
|
|||||||
CPU_VENDOR_UNKNOWN = 0xFFFFFFFF
|
CPU_VENDOR_UNKNOWN = 0xFFFFFFFF
|
||||||
} CPU_VENDOR, *PCPU_VENDOR;
|
} CPU_VENDOR, *PCPU_VENDOR;
|
||||||
|
|
||||||
|
/* CPUID advanced power management features (0x80000007) enumeration list */
|
||||||
|
typedef enum _CPUID_FEATURES_ADVANCED_POWER_MANAGEMENT
|
||||||
|
{
|
||||||
|
CPUID_FEATURES_EDX_TS = 1 << 0, /* Temperature Sensor */
|
||||||
|
CPUID_FEATURES_EDX_FIS = 1 << 1, /* Frequency ID Selection */
|
||||||
|
CPUID_FEATURES_EDX_VIS = 1 << 2, /* Voltage ID Selection */
|
||||||
|
CPUID_FEATURES_EDX_TTS = 1 << 3, /* ThermaTrip Support */
|
||||||
|
CPUID_FEATURES_EDX_HTC = 1 << 4, /* Hardware Thermal Throttling */
|
||||||
|
CPUID_FEATURES_EDX_STC = 1 << 5, /* Software Thermal Throttling */
|
||||||
|
CPUID_FEATURES_EDX_TSCI = 1 << 8 /* TSC Invariant */
|
||||||
|
} CPUID_FEATURES_ADVANCED_POWER_MANAGEMENT, *PCPUID_FEATURES_ADVANCED_POWER_MANAGEMENT;
|
||||||
|
|
||||||
/* CPUID extended features (0x80000001) enumeration list */
|
/* CPUID extended features (0x80000001) enumeration list */
|
||||||
typedef enum _CPUID_FEATURES_EXTENDED
|
typedef enum _CPUID_FEATURES_EXTENDED
|
||||||
{
|
{
|
||||||
@@ -176,6 +193,23 @@ typedef enum _CPUID_FEATURES_EXTENDED
|
|||||||
CPUID_FEATURES_EDX_3DNOW = 1 << 31
|
CPUID_FEATURES_EDX_3DNOW = 1 << 31
|
||||||
} CPUID_FEATURES_EXTENDED, *PCPUID_FEATURES_EXTENDED;
|
} CPUID_FEATURES_EXTENDED, *PCPUID_FEATURES_EXTENDED;
|
||||||
|
|
||||||
|
/* CPUID Thermal and Power Management features (0x00000006) enumeration list */
|
||||||
|
typedef enum _CPUID_FEATURES_POWER_MANAGEMENT
|
||||||
|
{
|
||||||
|
CPUID_FEATURES_EAX_DTHERM = 1 << 0,
|
||||||
|
CPUID_FEATURES_EAX_IDA = 1 << 1,
|
||||||
|
CPUID_FEATURES_EAX_ARAT = 1 << 2,
|
||||||
|
CPUID_FEATURES_EAX_PLN = 1 << 4,
|
||||||
|
CPUID_FEATURES_EAX_PTS = 1 << 6,
|
||||||
|
CPUID_FEATURES_EAX_HWP = 1 << 7,
|
||||||
|
CPUID_FEATURES_EAX_HWP_NOTIFY = 1 << 8,
|
||||||
|
CPUID_FEATURES_EAX_HWP_ACT_WINDOW = 1 << 9,
|
||||||
|
CPUID_FEATURES_EAX_HWP_EPP = 1 << 10,
|
||||||
|
CPUID_FEATURES_EAX_HWP_PKG_REQ = 1 << 11,
|
||||||
|
CPUID_FEATURES_EAX_HWP_HIGHEST_PERF_CHANGE = 1 << 15,
|
||||||
|
CPUID_FEATURES_EAX_HFI = 1 << 19
|
||||||
|
} CPUID_FEATURES_LEAF6, *PCPUID_FEATURES_LEAF6;
|
||||||
|
|
||||||
/* CPUID STD1 features (0x00000001) enumeration list */
|
/* CPUID STD1 features (0x00000001) enumeration list */
|
||||||
typedef enum _CPUID_FEATURES_STANDARD1
|
typedef enum _CPUID_FEATURES_STANDARD1
|
||||||
{
|
{
|
||||||
@@ -202,7 +236,7 @@ typedef enum _CPUID_FEATURES_STANDARD1
|
|||||||
CPUID_FEATURES_ECX_X2APIC = 1 << 21,
|
CPUID_FEATURES_ECX_X2APIC = 1 << 21,
|
||||||
CPUID_FEATURES_ECX_MOVBE = 1 << 22,
|
CPUID_FEATURES_ECX_MOVBE = 1 << 22,
|
||||||
CPUID_FEATURES_ECX_POPCNT = 1 << 23,
|
CPUID_FEATURES_ECX_POPCNT = 1 << 23,
|
||||||
CPUID_FEATURES_ECX_TSC = 1 << 24,
|
CPUID_FEATURES_ECX_TSC_DEADLINE = 1 << 24,
|
||||||
CPUID_FEATURES_ECX_AES = 1 << 25,
|
CPUID_FEATURES_ECX_AES = 1 << 25,
|
||||||
CPUID_FEATURES_ECX_XSAVE = 1 << 26,
|
CPUID_FEATURES_ECX_XSAVE = 1 << 26,
|
||||||
CPUID_FEATURES_ECX_OSXSAVE = 1 << 27,
|
CPUID_FEATURES_ECX_OSXSAVE = 1 << 27,
|
||||||
@@ -376,16 +410,23 @@ typedef enum _CPUID_FEATURES_STANDARD7_LEAF1
|
|||||||
/* CPUID requests */
|
/* CPUID requests */
|
||||||
typedef enum _CPUID_REQUESTS
|
typedef enum _CPUID_REQUESTS
|
||||||
{
|
{
|
||||||
CPUID_GET_VENDOR_STRING,
|
CPUID_GET_VENDOR_STRING = 0x00000000,
|
||||||
CPUID_GET_STANDARD1_FEATURES,
|
CPUID_GET_STANDARD1_FEATURES = 0x00000001,
|
||||||
CPUID_GET_TLB_CACHE,
|
CPUID_GET_TLB_CACHE = 0x00000002,
|
||||||
CPUID_GET_SERIAL,
|
CPUID_GET_SERIAL = 0x00000003,
|
||||||
CPUID_GET_CACHE_TOPOLOGY,
|
CPUID_GET_CACHE_TOPOLOGY = 0x00000004,
|
||||||
CPUID_GET_MONITOR_MWAIT,
|
CPUID_GET_MONITOR_MWAIT = 0x00000005,
|
||||||
CPUID_GET_POWER_MANAGEMENT,
|
CPUID_GET_POWER_MANAGEMENT = 0x00000006,
|
||||||
CPUID_GET_STANDARD7_FEATURES
|
CPUID_GET_STANDARD7_FEATURES = 0x00000007,
|
||||||
|
CPUID_GET_TSC_CRYSTAL_CLOCK = 0x00000015,
|
||||||
|
CPUID_GET_EXTENDED_MAX = 0x80000000,
|
||||||
|
CPUID_GET_EXTENDED_FEATURES = 0x80000001,
|
||||||
|
CPUID_GET_ADVANCED_POWER_MANAGEMENT = 0x80000007
|
||||||
} CPUID_REQUESTS, *PCPUID_REQUESTS;
|
} CPUID_REQUESTS, *PCPUID_REQUESTS;
|
||||||
|
|
||||||
|
/* Interrupt handler */
|
||||||
|
typedef VOID (*PINTERRUPT_HANDLER)(PKTRAP_FRAME TrapFrame);
|
||||||
|
|
||||||
/* Processor identification information */
|
/* Processor identification information */
|
||||||
typedef struct _CPU_IDENTIFICATION
|
typedef struct _CPU_IDENTIFICATION
|
||||||
{
|
{
|
||||||
@@ -426,4 +467,5 @@ typedef enum _TRAMPOLINE_TYPE
|
|||||||
TrampolineEnableXpa
|
TrampolineEnableXpa
|
||||||
} TRAMPOLINE_TYPE, *PTRAMPOLINE_TYPE;
|
} TRAMPOLINE_TYPE, *PTRAMPOLINE_TYPE;
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_AMD64_ARTYPES_H */
|
#endif /* __XTDK_AMD64_ARTYPES_H */
|
||||||
|
|||||||
@@ -15,6 +15,9 @@
|
|||||||
#include <amd64/xtstruct.h>
|
#include <amd64/xtstruct.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* Hardware layer routines forward references */
|
/* Hardware layer routines forward references */
|
||||||
XTCLINK
|
XTCLINK
|
||||||
XTCDECL
|
XTCDECL
|
||||||
@@ -49,4 +52,5 @@ VOID
|
|||||||
HlWritePort32(IN USHORT Port,
|
HlWritePort32(IN USHORT Port,
|
||||||
IN ULONG Value);
|
IN ULONG Value);
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_AMD64_HLFUNCS_H */
|
#endif /* __XTDK_AMD64_HLFUNCS_H */
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#ifndef __XTDK_AMD64_HLTYPES_H
|
#ifndef __XTDK_AMD64_HLTYPES_H
|
||||||
#define __XTDK_AMD64_HLTYPES_H
|
#define __XTDK_AMD64_HLTYPES_H
|
||||||
|
|
||||||
|
#include <xtbase.h>
|
||||||
#include <xtdefs.h>
|
#include <xtdefs.h>
|
||||||
#include <xtstruct.h>
|
#include <xtstruct.h>
|
||||||
#include <xttypes.h>
|
#include <xttypes.h>
|
||||||
@@ -53,6 +54,27 @@
|
|||||||
/* Maximum number of I/O APICs */
|
/* Maximum number of I/O APICs */
|
||||||
#define APIC_MAX_IOAPICS 64
|
#define APIC_MAX_IOAPICS 64
|
||||||
|
|
||||||
|
/* I/O APIC base address */
|
||||||
|
#define IOAPIC_DEFAULT_BASE 0xFEC00000
|
||||||
|
|
||||||
|
/* I/O APIC definitions */
|
||||||
|
#define IOAPIC_MAX_CONTROLLERS 128
|
||||||
|
#define IOAPIC_MAX_OVERRIDES 16
|
||||||
|
#define IOAPIC_RTE_MASKED 0x100FF
|
||||||
|
#define IOAPIC_RTE_SIZE 2
|
||||||
|
#define IOAPIC_VECTOR_FREE 0xFF
|
||||||
|
#define IOAPIC_VECTOR_RESERVED 0xFE
|
||||||
|
|
||||||
|
/* IOAPIC offsets */
|
||||||
|
#define IOAPIC_IOREGSEL 0x00
|
||||||
|
#define IOAPIC_IOWIN 0x10
|
||||||
|
|
||||||
|
/* IOAPIC registers */
|
||||||
|
#define IOAPIC_ID 0x00
|
||||||
|
#define IOAPIC_VER 0x01
|
||||||
|
#define IOAPIC_ARB 0x02
|
||||||
|
#define IOAPIC_REDTBL 0x10
|
||||||
|
|
||||||
/* 8259/ISP PIC ports definitions */
|
/* 8259/ISP PIC ports definitions */
|
||||||
#define PIC1_CONTROL_PORT 0x20
|
#define PIC1_CONTROL_PORT 0x20
|
||||||
#define PIC1_DATA_PORT 0x21
|
#define PIC1_DATA_PORT 0x21
|
||||||
@@ -62,6 +84,10 @@
|
|||||||
/* PIC vector definitions */
|
/* PIC vector definitions */
|
||||||
#define PIC1_VECTOR_SPURIOUS 0x37
|
#define PIC1_VECTOR_SPURIOUS 0x37
|
||||||
|
|
||||||
|
/* PIT ports definitions */
|
||||||
|
#define PIT_COMMAND_PORT 0x43
|
||||||
|
#define PIT_DATA_PORT0 0x40
|
||||||
|
|
||||||
/* Serial ports information */
|
/* Serial ports information */
|
||||||
#define COMPORT_ADDRESS {0x3F8, 0x2F8, 0x3E8, 0x2E8, 0x5F8, 0x4F8, 0x5E8, 0x4E8}
|
#define COMPORT_ADDRESS {0x3F8, 0x2F8, 0x3E8, 0x2E8, 0x5F8, 0x4F8, 0x5E8, 0x4E8}
|
||||||
#define COMPORT_COUNT 8
|
#define COMPORT_COUNT 8
|
||||||
@@ -69,6 +95,17 @@
|
|||||||
/* Initial stall factor */
|
/* Initial stall factor */
|
||||||
#define INITIAL_STALL_FACTOR 100
|
#define INITIAL_STALL_FACTOR 100
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
|
/* APIC destination mode enumeration list */
|
||||||
|
typedef enum _APIC_DEST_MODE
|
||||||
|
{
|
||||||
|
APIC_DM_Physical,
|
||||||
|
APIC_DM_Logical
|
||||||
|
} APIC_DEST_MODE, *PAPIC_DEST_MODE;
|
||||||
|
|
||||||
/* APIC delivery mode enumeration list */
|
/* APIC delivery mode enumeration list */
|
||||||
typedef enum _APIC_DM
|
typedef enum _APIC_DM
|
||||||
{
|
{
|
||||||
@@ -126,6 +163,7 @@ typedef enum _APIC_REGISTER
|
|||||||
APIC_TICR = 0x38, /* Initial Count Register for Timer */
|
APIC_TICR = 0x38, /* Initial Count Register for Timer */
|
||||||
APIC_TCCR = 0x39, /* Current Count Register for Timer */
|
APIC_TCCR = 0x39, /* Current Count Register for Timer */
|
||||||
APIC_TDCR = 0x3E, /* Timer Divide Configuration Register */
|
APIC_TDCR = 0x3E, /* Timer Divide Configuration Register */
|
||||||
|
APIC_SIPI = 0x3F, /* Self-IPI Register */
|
||||||
APIC_EAFR = 0x40, /* extended APIC Feature register */
|
APIC_EAFR = 0x40, /* extended APIC Feature register */
|
||||||
APIC_EACR = 0x41, /* Extended APIC Control Register */
|
APIC_EACR = 0x41, /* Extended APIC Control Register */
|
||||||
APIC_SEOI = 0x42, /* Specific End Of Interrupt Register */
|
APIC_SEOI = 0x42, /* Specific End Of Interrupt Register */
|
||||||
@@ -135,6 +173,19 @@ typedef enum _APIC_REGISTER
|
|||||||
APIC_EXT3LVTR = 0x53 /* Extended Interrupt 3 Local Vector Table */
|
APIC_EXT3LVTR = 0x53 /* Extended Interrupt 3 Local Vector Table */
|
||||||
} APIC_REGISTER, *PAPIC_REGISTER;
|
} APIC_REGISTER, *PAPIC_REGISTER;
|
||||||
|
|
||||||
|
/* APIC Timer Divide enumeration list */
|
||||||
|
typedef enum _APIC_TIMER_DIVISOR
|
||||||
|
{
|
||||||
|
TIMER_DivideBy2 = 0,
|
||||||
|
TIMER_DivideBy4 = 1,
|
||||||
|
TIMER_DivideBy8 = 2,
|
||||||
|
TIMER_DivideBy16 = 3,
|
||||||
|
TIMER_DivideBy32 = 8,
|
||||||
|
TIMER_DivideBy64 = 9,
|
||||||
|
TIMER_DivideBy128 = 10,
|
||||||
|
TIMER_DivideBy1 = 11,
|
||||||
|
} APIC_TIMER_DIVISOR, *PAPIC_TIMER_DIVISOR;
|
||||||
|
|
||||||
/* I8259 PIC interrupt mode enumeration list */
|
/* I8259 PIC interrupt mode enumeration list */
|
||||||
typedef enum _PIC_I8259_ICW1_INTERRUPT_MODE
|
typedef enum _PIC_I8259_ICW1_INTERRUPT_MODE
|
||||||
{
|
{
|
||||||
@@ -252,6 +303,40 @@ typedef union _APIC_SPURIOUS_REGISTER
|
|||||||
};
|
};
|
||||||
} APIC_SPURIOUS_REGISTER, *PAPIC_SPURIOUS_REGISTER;
|
} APIC_SPURIOUS_REGISTER, *PAPIC_SPURIOUS_REGISTER;
|
||||||
|
|
||||||
|
/* I/O APIC Controller information */
|
||||||
|
typedef struct _IOAPIC_DATA
|
||||||
|
{
|
||||||
|
ULONG GsiBase;
|
||||||
|
ULONG Identifier;
|
||||||
|
ULONG LineCount;
|
||||||
|
PHYSICAL_ADDRESS PhysicalAddress;
|
||||||
|
ULONG_PTR VirtualAddress;
|
||||||
|
} IOAPIC_DATA, *PIOAPIC_DATA;
|
||||||
|
|
||||||
|
/* I/O APIC Redirection Register */
|
||||||
|
typedef union _IOAPIC_REDIRECTION_REGISTER
|
||||||
|
{
|
||||||
|
ULONGLONG LongLong;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
UINT Base;
|
||||||
|
UINT Extended;
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
ULONGLONG Vector:8;
|
||||||
|
ULONGLONG DeliveryMode:3;
|
||||||
|
ULONGLONG DestinationMode:1;
|
||||||
|
ULONGLONG DeliveryStatus:1;
|
||||||
|
ULONGLONG PinPolarity:1;
|
||||||
|
ULONGLONG RemoteIRR:1;
|
||||||
|
ULONGLONG TriggerMode:1;
|
||||||
|
ULONGLONG Mask:1;
|
||||||
|
ULONGLONG Reserved:39;
|
||||||
|
ULONGLONG Destination:8;
|
||||||
|
};
|
||||||
|
} IOAPIC_REDIRECTION_REGISTER, *PIOAPIC_REDIRECTION_REGISTER;
|
||||||
|
|
||||||
/* I8259 PIC register structure */
|
/* I8259 PIC register structure */
|
||||||
typedef union _PIC_I8259_ICW1
|
typedef union _PIC_I8259_ICW1
|
||||||
{
|
{
|
||||||
@@ -317,4 +402,17 @@ typedef union _PIC_I8259_ICW4
|
|||||||
UCHAR Bits;
|
UCHAR Bits;
|
||||||
} PIC_I8259_ICW4, *PPIC_I8259_ICW4;
|
} PIC_I8259_ICW4, *PPIC_I8259_ICW4;
|
||||||
|
|
||||||
|
typedef struct _TIMER_CAPABILITIES
|
||||||
|
{
|
||||||
|
BOOLEAN Arat;
|
||||||
|
BOOLEAN Art;
|
||||||
|
BOOLEAN InvariantTsc;
|
||||||
|
BOOLEAN RDTSCP;
|
||||||
|
ULONG TimerFrequency;
|
||||||
|
BOOLEAN TscDeadline;
|
||||||
|
ULONG TscDenominator;
|
||||||
|
ULONG TscNumerator;
|
||||||
|
} TIMER_CAPABILITIES, *PTIMER_CAPABILITIES;
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_AMD64_HLTYPES_H */
|
#endif /* __XTDK_AMD64_HLTYPES_H */
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
/* GDT selector names */
|
/* GDT selector names */
|
||||||
#define KGDT_NULL 0x0000
|
#define KGDT_NULL 0x0000
|
||||||
|
#define KGDT_R0_CMCODE 0x0008
|
||||||
#define KGDT_R0_CODE 0x0010
|
#define KGDT_R0_CODE 0x0010
|
||||||
#define KGDT_R0_DATA 0x0018
|
#define KGDT_R0_DATA 0x0018
|
||||||
#define KGDT_R3_CMCODE 0x0020
|
#define KGDT_R3_CMCODE 0x0020
|
||||||
@@ -46,7 +47,7 @@
|
|||||||
#define KGDT_DESCRIPTOR_CODE 0x08
|
#define KGDT_DESCRIPTOR_CODE 0x08
|
||||||
|
|
||||||
/* GDT descriptor type codes */
|
/* GDT descriptor type codes */
|
||||||
#define KGDT_TYPE_NONE 0x0
|
#define KGDT_TYPE_NONE 0x00
|
||||||
#define KGDT_TYPE_CODE (0x10 | KGDT_DESCRIPTOR_CODE | KGDT_DESCRIPTOR_EXECUTE_READ)
|
#define KGDT_TYPE_CODE (0x10 | KGDT_DESCRIPTOR_CODE | KGDT_DESCRIPTOR_EXECUTE_READ)
|
||||||
#define KGDT_TYPE_DATA (0x10 | KGDT_DESCRIPTOR_READ_WRITE)
|
#define KGDT_TYPE_DATA (0x10 | KGDT_DESCRIPTOR_READ_WRITE)
|
||||||
|
|
||||||
@@ -58,6 +59,7 @@
|
|||||||
#define KIDT_IST_RESERVED 0
|
#define KIDT_IST_RESERVED 0
|
||||||
#define KIDT_IST_PANIC 1
|
#define KIDT_IST_PANIC 1
|
||||||
#define KIDT_IST_MCA 2
|
#define KIDT_IST_MCA 2
|
||||||
|
#define KIDT_IST_NMI 3
|
||||||
|
|
||||||
/* AMD64 Segment Types */
|
/* AMD64 Segment Types */
|
||||||
#define AMD64_TASK_GATE 0x5
|
#define AMD64_TASK_GATE 0x5
|
||||||
@@ -108,11 +110,9 @@
|
|||||||
/* Static Kernel-Mode address start */
|
/* Static Kernel-Mode address start */
|
||||||
#define KSEG0_BASE 0xFFFFF80000000000
|
#define KSEG0_BASE 0xFFFFF80000000000
|
||||||
|
|
||||||
/* XTOS Kernel address base */
|
|
||||||
#define KSEG0_KERNEL_BASE 0x0000000800000000
|
|
||||||
|
|
||||||
/* XTOS Kernel stack size */
|
/* XTOS Kernel stack size */
|
||||||
#define KERNEL_STACK_SIZE 0x8000
|
#define KERNEL_STACK_SIZE 0x8000
|
||||||
|
#define KERNEL_STACKS 3
|
||||||
|
|
||||||
/* XTOS Kernel stack guard pages */
|
/* XTOS Kernel stack guard pages */
|
||||||
#define KERNEL_STACK_GUARD_PAGES 1
|
#define KERNEL_STACK_GUARD_PAGES 1
|
||||||
@@ -138,6 +138,10 @@
|
|||||||
#define NPX_STATE_SCRUB 0x1
|
#define NPX_STATE_SCRUB 0x1
|
||||||
#define NPX_STATE_SWITCH 0x2
|
#define NPX_STATE_SWITCH 0x2
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* Floating point state storing structure */
|
/* Floating point state storing structure */
|
||||||
typedef struct _FLOATING_SAVE_AREA
|
typedef struct _FLOATING_SAVE_AREA
|
||||||
{
|
{
|
||||||
@@ -272,11 +276,18 @@ typedef struct _KIDTENTRY
|
|||||||
{
|
{
|
||||||
USHORT OffsetLow;
|
USHORT OffsetLow;
|
||||||
USHORT Selector;
|
USHORT Selector;
|
||||||
USHORT IstIndex:3;
|
union
|
||||||
USHORT Reserved0:5;
|
{
|
||||||
USHORT Type:5;
|
struct
|
||||||
USHORT Dpl:2;
|
{
|
||||||
USHORT Present:1;
|
USHORT IstIndex:3;
|
||||||
|
USHORT Reserved0:5;
|
||||||
|
USHORT Type:5;
|
||||||
|
USHORT Dpl:2;
|
||||||
|
USHORT Present:1;
|
||||||
|
};
|
||||||
|
USHORT Access;
|
||||||
|
};
|
||||||
USHORT OffsetMiddle;
|
USHORT OffsetMiddle;
|
||||||
ULONG OffsetHigh;
|
ULONG OffsetHigh;
|
||||||
ULONG Reserved1;
|
ULONG Reserved1;
|
||||||
@@ -512,6 +523,7 @@ typedef struct _KPROCESSOR_BLOCK
|
|||||||
KAFFINITY SetMember;
|
KAFFINITY SetMember;
|
||||||
ULONG StallScaleFactor;
|
ULONG StallScaleFactor;
|
||||||
UCHAR CpuNumber;
|
UCHAR CpuNumber;
|
||||||
|
PINTERRUPT_HANDLER InterruptDispatchTable[256];
|
||||||
} KPROCESSOR_BLOCK, *PKPROCESSOR_BLOCK;
|
} KPROCESSOR_BLOCK, *PKPROCESSOR_BLOCK;
|
||||||
|
|
||||||
/* Thread Environment Block (TEB) structure definition */
|
/* Thread Environment Block (TEB) structure definition */
|
||||||
@@ -520,4 +532,5 @@ typedef struct _THREAD_ENVIRONMENT_BLOCK
|
|||||||
THREAD_INFORMATION_BLOCK InformationBlock;
|
THREAD_INFORMATION_BLOCK InformationBlock;
|
||||||
} THREAD_ENVIRONMENT_BLOCK, *PTHREAD_ENVIRONMENT_BLOCK;
|
} THREAD_ENVIRONMENT_BLOCK, *PTHREAD_ENVIRONMENT_BLOCK;
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_AMD64_KETYPES_H */
|
#endif /* __XTDK_AMD64_KETYPES_H */
|
||||||
|
|||||||
@@ -25,11 +25,11 @@
|
|||||||
#define MM_PXE_BASE 0xFFFFF6FB7DBED000ULL
|
#define MM_PXE_BASE 0xFFFFF6FB7DBED000ULL
|
||||||
|
|
||||||
/* Page directory and page base addresses for 5-level paging */
|
/* Page directory and page base addresses for 5-level paging */
|
||||||
#define MM_PTE_LA57_BASE 0xFFFF000000000000ULL
|
#define MM_PTE_LA57_BASE 0xFFED000000000000ULL
|
||||||
#define MM_PDE_LA57_BASE 0xFFFF010000000000ULL
|
#define MM_PDE_LA57_BASE 0xFFEDF68000000000ULL
|
||||||
#define MM_PPE_LA57_BASE 0xFFFF010800000000ULL
|
#define MM_PPE_LA57_BASE 0xFFEDF6FB40000000ULL
|
||||||
#define MM_PXE_LA57_BASE 0xFFFF010840000000ULL
|
#define MM_PXE_LA57_BASE 0xFFEDF6FB7DA00000ULL
|
||||||
#define MM_P5E_LA57_BASE 0xFFFF010840200000ULL
|
#define MM_P5E_LA57_BASE 0xFFEDF6FB7DBED000ULL
|
||||||
|
|
||||||
/* PTE shift values */
|
/* PTE shift values */
|
||||||
#define MM_PTE_SHIFT 3
|
#define MM_PTE_SHIFT 3
|
||||||
@@ -39,15 +39,56 @@
|
|||||||
#define MM_PXI_SHIFT 39
|
#define MM_PXI_SHIFT 39
|
||||||
#define MM_P5I_SHIFT 48
|
#define MM_P5I_SHIFT 48
|
||||||
|
|
||||||
/* Number of PTEs per page */
|
/* PTE state flags */
|
||||||
#define MM_PTE_PER_PAGE 512
|
#define MM_PTE_VALID 0x0000000000000001ULL
|
||||||
#define MM_PDE_PER_PAGE 512
|
#define MM_PTE_ACCESSED 0x0000000000000020ULL
|
||||||
#define MM_PPE_PER_PAGE 512
|
#define MM_PTE_DIRTY 0x0000000000000040ULL
|
||||||
#define MM_PXE_PER_PAGE 512
|
|
||||||
|
/* PTE scope flags */
|
||||||
|
#define MM_PTE_LARGE_PAGE 0x0000000000000080ULL
|
||||||
|
#define MM_PTE_GLOBAL 0x0000000000000100ULL
|
||||||
|
|
||||||
|
/* PTE access flags */
|
||||||
|
#define MM_PTE_NOACCESS 0x0000000000000000ULL
|
||||||
|
#define MM_PTE_READONLY 0x0000000000000000ULL
|
||||||
|
#define MM_PTE_EXECUTE 0x0000000000000000ULL
|
||||||
|
#define MM_PTE_EXECUTE_READ 0x0000000000000000ULL
|
||||||
|
#define MM_PTE_READWRITE 0x8000000000000002ULL
|
||||||
|
#define MM_PTE_WRITECOPY 0x8000000000000200ULL
|
||||||
|
#define MM_PTE_EXECUTE_READWRITE 0x0000000000000002ULL
|
||||||
|
#define MM_PTE_EXECUTE_WRITECOPY 0x0000000000000200ULL
|
||||||
|
|
||||||
|
/* PTE protection flags */
|
||||||
|
#define MM_PTE_NOEXECUTE 0x8000000000000000ULL
|
||||||
|
#define MM_PTE_GUARDED 0x8000000000000018ULL
|
||||||
|
#define MM_PTE_PROTECT 0x8000000000000612ULL
|
||||||
|
|
||||||
|
/* PTE cache flags */
|
||||||
|
#define MM_PTE_CACHE_ENABLE 0x0000000000000000ULL
|
||||||
|
#define MM_PTE_CACHE_DISABLE 0x0000000000000010ULL
|
||||||
|
#define MM_PTE_CACHE_WRITECOMBINED 0x0000000000000010ULL
|
||||||
|
#define MM_PTE_CACHE_WRITETHROUGH 0x0000000000000008ULL
|
||||||
|
|
||||||
|
/* PTE software flags */
|
||||||
|
#define MM_PTE_COPY_ON_WRITE 0x0000000000000200ULL
|
||||||
|
#define MM_PTE_PROTOTYPE 0x0000000000000400ULL
|
||||||
|
#define MM_PTE_TRANSITION 0x0000000000000800ULL
|
||||||
|
|
||||||
|
/* PTE frame bits */
|
||||||
|
#define MM_PTE_FRAME_BITS 57
|
||||||
|
|
||||||
|
/* PTE protection bits */
|
||||||
|
#define MM_PTE_PROTECTION_BITS 5
|
||||||
|
|
||||||
|
/* Base address of the system page table */
|
||||||
|
#define MM_SYSTEM_PTE_BASE KSEG0_BASE
|
||||||
|
|
||||||
/* Minimum number of physical pages needed by the system */
|
/* Minimum number of physical pages needed by the system */
|
||||||
#define MM_MINIMUM_PHYSICAL_PAGES 2048
|
#define MM_MINIMUM_PHYSICAL_PAGES 2048
|
||||||
|
|
||||||
|
/* Number of system PTEs */
|
||||||
|
#define MM_DEFAULT_NUMBER_SYSTEM_PTES 22000
|
||||||
|
|
||||||
/* Default number of secondary colors */
|
/* Default number of secondary colors */
|
||||||
#define MM_DEFAULT_SECONDARY_COLORS 64
|
#define MM_DEFAULT_SECONDARY_COLORS 64
|
||||||
|
|
||||||
@@ -63,9 +104,25 @@
|
|||||||
/* Maximum physical address used by HAL allocations */
|
/* Maximum physical address used by HAL allocations */
|
||||||
#define MM_MAXIMUM_PHYSICAL_ADDRESS 0x00000000FFFFFFFFULL
|
#define MM_MAXIMUM_PHYSICAL_ADDRESS 0x00000000FFFFFFFFULL
|
||||||
|
|
||||||
|
/* Highest system address */
|
||||||
|
#define MM_HIGHEST_SYSTEM_ADDRESS 0xFFFFFFFFFFFFFFFFULL
|
||||||
|
|
||||||
/* Trampoline code address */
|
/* Trampoline code address */
|
||||||
#define MM_TRAMPOLINE_ADDRESS 0x80000
|
#define MM_TRAMPOLINE_ADDRESS 0x80000
|
||||||
|
|
||||||
|
/* Pool block size */
|
||||||
|
#define MM_POOL_BLOCK_SIZE 16
|
||||||
|
|
||||||
|
/* Number of pool lists per page */
|
||||||
|
#define MM_POOL_LISTS_PER_PAGE (MM_PAGE_SIZE / MM_POOL_BLOCK_SIZE)
|
||||||
|
|
||||||
|
/* Number of pool tracking tables */
|
||||||
|
#define MM_POOL_TRACKING_TABLES 64
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* Page size enumeration list */
|
/* Page size enumeration list */
|
||||||
typedef enum _PAGE_SIZE
|
typedef enum _PAGE_SIZE
|
||||||
{
|
{
|
||||||
@@ -252,6 +309,7 @@ typedef struct _MMPFN
|
|||||||
USHORT ReferenceCount;
|
USHORT ReferenceCount;
|
||||||
} e2;
|
} e2;
|
||||||
} u3;
|
} u3;
|
||||||
|
ULONG UsedPageTableEntries;
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
MMPTE OriginalPte;
|
MMPTE OriginalPte;
|
||||||
@@ -262,15 +320,33 @@ typedef struct _MMPFN
|
|||||||
ULONG_PTR EntireFrame;
|
ULONG_PTR EntireFrame;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
ULONG_PTR PteFrame:58;
|
ULONG_PTR PteFrame:57;
|
||||||
ULONG_PTR InPageError:1;
|
ULONG_PTR InPageError:1;
|
||||||
ULONG_PTR VerifierAllocation:1;
|
ULONG_PTR VerifierAllocation:1;
|
||||||
ULONG_PTR AweAllocation:1;
|
ULONG_PTR AweAllocation:1;
|
||||||
ULONG_PTR LockCharged:1;
|
ULONG_PTR Priority:3;
|
||||||
ULONG_PTR KernelStack:1;
|
|
||||||
ULONG_PTR MustBeCached:1;
|
ULONG_PTR MustBeCached:1;
|
||||||
};
|
};
|
||||||
} u4;
|
} u4;
|
||||||
} MMPFN, *PMMPFN;
|
} MMPFN, *PMMPFN;
|
||||||
|
|
||||||
|
/* Pool descriptor structure definition */
|
||||||
|
typedef struct _POOL_DESCRIPTOR
|
||||||
|
{
|
||||||
|
LIST_ENTRY ListHeads[MM_POOL_LISTS_PER_PAGE];
|
||||||
|
PVOID LockAddress;
|
||||||
|
ULONG PoolIndex;
|
||||||
|
LONG PendingFreeDepth;
|
||||||
|
PVOID PendingFrees;
|
||||||
|
MMPOOL_TYPE PoolType;
|
||||||
|
ULONG RunningFrees;
|
||||||
|
ULONG RunningAllocations;
|
||||||
|
ULONG Threshold;
|
||||||
|
ULONG TotalPages;
|
||||||
|
ULONG TotalBigAllocations;
|
||||||
|
SIZE_T TotalBytes;
|
||||||
|
SIZE_T Reserved;
|
||||||
|
} POOL_DESCRIPTOR, *PPOOL_DESCRIPTOR;
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_AMD64_MMTYPES_H */
|
#endif /* __XTDK_AMD64_MMTYPES_H */
|
||||||
|
|||||||
@@ -12,13 +12,20 @@
|
|||||||
#include <xtdefs.h>
|
#include <xtdefs.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* Architecture-specific enumeration lists forward references */
|
/* Architecture-specific enumeration lists forward references */
|
||||||
|
typedef enum _APIC_DEST_MODE APIC_DEST_MODE, *PAPIC_DEST_MODE;
|
||||||
typedef enum _APIC_DM APIC_DM, *PAPIC_DM;
|
typedef enum _APIC_DM APIC_DM, *PAPIC_DM;
|
||||||
typedef enum _APIC_DSH APIC_DSH, *PAPIC_DSH;
|
typedef enum _APIC_DSH APIC_DSH, *PAPIC_DSH;
|
||||||
typedef enum _APIC_MODE APIC_MODE, *PAPIC_MODE;
|
typedef enum _APIC_MODE APIC_MODE, *PAPIC_MODE;
|
||||||
typedef enum _APIC_REGISTER APIC_REGISTER, *PAPIC_REGISTER;
|
typedef enum _APIC_REGISTER APIC_REGISTER, *PAPIC_REGISTER;
|
||||||
|
typedef enum _APIC_TIMER_DIVISOR APIC_TIMER_DIVISOR, *PAPIC_TIMER_DIVISOR;
|
||||||
typedef enum _CPU_VENDOR CPU_VENDOR, *PCPU_VENDOR;
|
typedef enum _CPU_VENDOR CPU_VENDOR, *PCPU_VENDOR;
|
||||||
|
typedef enum _CPUID_FEATURES_ADVANCED_POWER_MANAGEMENT CPUID_FEATURES_ADVANCED_POWER_MANAGEMENT, *PCPUID_FEATURES_ADVANCED_POWER_MANAGEMENT;
|
||||||
typedef enum _CPUID_FEATURES_EXTENDED CPUID_FEATURES_EXTENDED, *PCPUID_FEATURES_EXTENDED;
|
typedef enum _CPUID_FEATURES_EXTENDED CPUID_FEATURES_EXTENDED, *PCPUID_FEATURES_EXTENDED;
|
||||||
|
typedef enum _CPUID_FEATURES_POWER_MANAGEMENT CPUID_FEATURES_POWER_MANAGEMENT, *PCPUID_FEATURES_POWER_MANAGEMENT;
|
||||||
typedef enum _CPUID_FEATURES_STANDARD1 CPUID_FEATURES_STANDARD1, *PCPUID_FEATURES_STANDARD1;
|
typedef enum _CPUID_FEATURES_STANDARD1 CPUID_FEATURES_STANDARD1, *PCPUID_FEATURES_STANDARD1;
|
||||||
typedef enum _CPUID_FEATURES_STANDARD7_LEAF0 CPUID_FEATURES_STANDARD7_LEAF0, *PCPUID_FEATURES_STANDARD7_LEAF0;
|
typedef enum _CPUID_FEATURES_STANDARD7_LEAF0 CPUID_FEATURES_STANDARD7_LEAF0, *PCPUID_FEATURES_STANDARD7_LEAF0;
|
||||||
typedef enum _CPUID_FEATURES_STANDARD7_LEAF1 CPUID_FEATURES_STANDARD7_LEAF1, *PCPUID_FEATURES_STANDARD7_LEAF1;
|
typedef enum _CPUID_FEATURES_STANDARD7_LEAF1 CPUID_FEATURES_STANDARD7_LEAF1, *PCPUID_FEATURES_STANDARD7_LEAF1;
|
||||||
@@ -39,6 +46,7 @@ typedef struct _CPUID_REGISTERS CPUID_REGISTERS, *PCPUID_REGISTERS;
|
|||||||
typedef struct _CPUID_SIGNATURE CPUID_SIGNATURE, *PCPUID_SIGNATURE;
|
typedef struct _CPUID_SIGNATURE CPUID_SIGNATURE, *PCPUID_SIGNATURE;
|
||||||
typedef struct _FLOATING_SAVE_AREA FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
|
typedef struct _FLOATING_SAVE_AREA FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
|
||||||
typedef struct _HARDWARE_PTE HARDWARE_PTE, *PHARDWARE_PTE;
|
typedef struct _HARDWARE_PTE HARDWARE_PTE, *PHARDWARE_PTE;
|
||||||
|
typedef struct _IOAPIC_DATA IOAPIC_DATA, *PIOAPIC_DATA;
|
||||||
typedef struct _KDESCRIPTOR KDESCRIPTOR, *PKDESCRIPTOR;
|
typedef struct _KDESCRIPTOR KDESCRIPTOR, *PKDESCRIPTOR;
|
||||||
typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
|
typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
|
||||||
typedef struct _KGDTENTRY KGDTENTRY, *PKGDTENTRY;
|
typedef struct _KGDTENTRY KGDTENTRY, *PKGDTENTRY;
|
||||||
@@ -61,13 +69,16 @@ typedef struct _MMPTE_PROTOTYPE MMPTE_PROTOTYPE, *PMMPTE_PROTOTYPE;
|
|||||||
typedef struct _MMPTE_SOFTWARE MMPTE_SOFTWARE, *PMMPTE_SOFTWARE;
|
typedef struct _MMPTE_SOFTWARE MMPTE_SOFTWARE, *PMMPTE_SOFTWARE;
|
||||||
typedef struct _MMPTE_SUBSECTION MMPTE_SUBSECTION, *PMMPTE_SUBSECTION;
|
typedef struct _MMPTE_SUBSECTION MMPTE_SUBSECTION, *PMMPTE_SUBSECTION;
|
||||||
typedef struct _MMPTE_TRANSITION MMPTE_TRANSITION, *PMMPTE_TRANSITION;
|
typedef struct _MMPTE_TRANSITION MMPTE_TRANSITION, *PMMPTE_TRANSITION;
|
||||||
|
typedef struct _POOL_DESCRIPTOR POOL_DESCRIPTOR, *PPOOL_DESCRIPTOR;
|
||||||
typedef struct _THREAD_ENVIRONMENT_BLOCK THREAD_ENVIRONMENT_BLOCK, *PTHREAD_ENVIRONMENT_BLOCK;
|
typedef struct _THREAD_ENVIRONMENT_BLOCK THREAD_ENVIRONMENT_BLOCK, *PTHREAD_ENVIRONMENT_BLOCK;
|
||||||
|
typedef struct _TIMER_CAPABILITIES TIMER_CAPABILITIES, *PTIMER_CAPABILITIES;
|
||||||
|
|
||||||
/* Unions forward references */
|
/* Unions forward references */
|
||||||
typedef union _APIC_BASE_REGISTER APIC_BASE_REGISTER, *PAPIC_BASE_REGISTER;
|
typedef union _APIC_BASE_REGISTER APIC_BASE_REGISTER, *PAPIC_BASE_REGISTER;
|
||||||
typedef union _APIC_COMMAND_REGISTER APIC_COMMAND_REGISTER, *PAPIC_COMMAND_REGISTER;
|
typedef union _APIC_COMMAND_REGISTER APIC_COMMAND_REGISTER, *PAPIC_COMMAND_REGISTER;
|
||||||
typedef union _APIC_LVT_REGISTER APIC_LVT_REGISTER, *PAPIC_LVT_REGISTER;
|
typedef union _APIC_LVT_REGISTER APIC_LVT_REGISTER, *PAPIC_LVT_REGISTER;
|
||||||
typedef union _APIC_SPURIOUS_REGISTER APIC_SPURIOUS_REGISTER, *PAPIC_SPURIOUS_REGISTER;
|
typedef union _APIC_SPURIOUS_REGISTER APIC_SPURIOUS_REGISTER, *PAPIC_SPURIOUS_REGISTER;
|
||||||
|
typedef union _IOAPIC_REDIRECTION_REGISTER IOAPIC_REDIRECTION_REGISTER, *PIOAPIC_REDIRECTION_REGISTER;
|
||||||
typedef union _MMPTE MMP5E, *PMMP5E;
|
typedef union _MMPTE MMP5E, *PMMP5E;
|
||||||
typedef union _MMPTE MMPDE, *PMMPDE;
|
typedef union _MMPTE MMPDE, *PMMPDE;
|
||||||
typedef union _MMPTE MMPPE, *PMMPPE;
|
typedef union _MMPTE MMPPE, *PMMPPE;
|
||||||
@@ -78,4 +89,5 @@ typedef union _PIC_I8259_ICW2 PIC_I8259_ICW2, *PPIC_I8259_ICW2;
|
|||||||
typedef union _PIC_I8259_ICW3 PIC_I8259_ICW3, *PPIC_I8259_ICW3;
|
typedef union _PIC_I8259_ICW3 PIC_I8259_ICW3, *PPIC_I8259_ICW3;
|
||||||
typedef union _PIC_I8259_ICW4 PIC_I8259_ICW4, *PPIC_I8259_ICW4;
|
typedef union _PIC_I8259_ICW4 PIC_I8259_ICW4, *PPIC_I8259_ICW4;
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_AMD64_XTSTRUCT_H */
|
#endif /* __XTDK_AMD64_XTSTRUCT_H */
|
||||||
|
|||||||
@@ -13,6 +13,9 @@
|
|||||||
#include <xtuefi.h>
|
#include <xtuefi.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef D__XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* XT BootLoader routines forward references */
|
/* XT BootLoader routines forward references */
|
||||||
XTCLINK
|
XTCLINK
|
||||||
XTCDECL
|
XTCDECL
|
||||||
@@ -21,4 +24,5 @@ BlGetXtLdrProtocol(IN PEFI_SYSTEM_TABLE SystemTable,
|
|||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
OUT PXTBL_LOADER_PROTOCOL *ProtocolHandler);
|
OUT PXTBL_LOADER_PROTOCOL *ProtocolHandler);
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_BLFUNCS_H */
|
#endif /* __XTDK_BLFUNCS_H */
|
||||||
|
|||||||
@@ -41,6 +41,10 @@
|
|||||||
/* TUI dialog box maximum width */
|
/* TUI dialog box maximum width */
|
||||||
#define XTBL_TUI_MAX_DIALOG_WIDTH 100
|
#define XTBL_TUI_MAX_DIALOG_WIDTH 100
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef D__XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* XTLDR Routine pointers */
|
/* XTLDR Routine pointers */
|
||||||
typedef LOADER_MEMORY_TYPE (XTCDECL *PBL_GET_MEMTYPE_ROUTINE)(IN EFI_MEMORY_TYPE EfiMemoryType);
|
typedef LOADER_MEMORY_TYPE (XTCDECL *PBL_GET_MEMTYPE_ROUTINE)(IN EFI_MEMORY_TYPE EfiMemoryType);
|
||||||
|
|
||||||
@@ -51,6 +55,7 @@ typedef EFI_STATUS (XTCDECL *PBL_BOOTMENU_INITIALIZE_OS_LIST)(IN ULONG MaxNameLe
|
|||||||
typedef BOOLEAN (XTCDECL *PBL_BOOTUTILS_GET_BOOLEAN_PARAMETER)(IN PCWSTR Parameters, IN PCWSTR Needle);
|
typedef BOOLEAN (XTCDECL *PBL_BOOTUTILS_GET_BOOLEAN_PARAMETER)(IN PCWSTR Parameters, IN PCWSTR Needle);
|
||||||
typedef VOID (XTAPI *PBL_BOOTUTILS_GET_TRAMPOLINE_INFORMATION)(IN TRAMPOLINE_TYPE TrampolineType, OUT PVOID *TrampolineCode, OUT PULONG_PTR TrampolineSize);
|
typedef VOID (XTAPI *PBL_BOOTUTILS_GET_TRAMPOLINE_INFORMATION)(IN TRAMPOLINE_TYPE TrampolineType, OUT PVOID *TrampolineCode, OUT PULONG_PTR TrampolineSize);
|
||||||
typedef EFI_STATUS (XTCDECL *PBL_BUILD_PAGE_MAP)(IN PXTBL_PAGE_MAPPING PageMap, IN ULONG_PTR SelfMapAddress);
|
typedef EFI_STATUS (XTCDECL *PBL_BUILD_PAGE_MAP)(IN PXTBL_PAGE_MAPPING PageMap, IN ULONG_PTR SelfMapAddress);
|
||||||
|
typedef EFI_STATUS (XTCDECL *PBL_COMMIT_PAGE_MAP)(IN PXTBL_PAGE_MAPPING PageMap);
|
||||||
typedef EFI_STATUS (XTCDECL *PBL_CLOSE_VOLUME)(IN PEFI_HANDLE VolumeHandle);
|
typedef EFI_STATUS (XTCDECL *PBL_CLOSE_VOLUME)(IN PEFI_HANDLE VolumeHandle);
|
||||||
typedef VOID (XTCDECL *PBL_CLEAR_CONSOLE_LINE)(IN ULONGLONG LineNo);
|
typedef VOID (XTCDECL *PBL_CLEAR_CONSOLE_LINE)(IN ULONGLONG LineNo);
|
||||||
typedef BOOLEAN (XTCDECL *PBL_CPU_CPUID)(IN OUT PCPUID_REGISTERS Registers);
|
typedef BOOLEAN (XTCDECL *PBL_CPU_CPUID)(IN OUT PCPUID_REGISTERS Registers);
|
||||||
@@ -100,9 +105,9 @@ typedef VOID (XTCDECL *PBL_LLIST_INITIALIZE_HEAD)(IN PLIST_ENTRY ListHead);
|
|||||||
typedef VOID (XTCDECL *PBL_LLIST_INSERT_HEAD)(IN OUT PLIST_ENTRY ListHead, IN PLIST_ENTRY Entry);
|
typedef VOID (XTCDECL *PBL_LLIST_INSERT_HEAD)(IN OUT PLIST_ENTRY ListHead, IN PLIST_ENTRY Entry);
|
||||||
typedef VOID (XTCDECL *PBL_LLIST_INSERT_TAIL)(IN OUT PLIST_ENTRY ListHead, IN PLIST_ENTRY Entry);
|
typedef VOID (XTCDECL *PBL_LLIST_INSERT_TAIL)(IN OUT PLIST_ENTRY ListHead, IN PLIST_ENTRY Entry);
|
||||||
typedef VOID (XTCDECL *PBL_LLIST_REMOVE_ENTRY)(IN PLIST_ENTRY Entry);
|
typedef VOID (XTCDECL *PBL_LLIST_REMOVE_ENTRY)(IN PLIST_ENTRY Entry);
|
||||||
typedef EFI_STATUS (XTCDECL *PBL_MAP_EFI_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN OUT PVOID *MemoryMapAddress, IN PBL_GET_MEMTYPE_ROUTINE GetMemoryTypeRoutine);
|
typedef EFI_STATUS (XTCDECL *PBL_MAP_EFI_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN OUT PVOID *BaseAddress, IN BOOLEAN IdentityMapping, IN PBL_GET_MEMTYPE_ROUTINE GetMemoryTypeRoutine);
|
||||||
typedef EFI_STATUS (XTCDECL *PBL_MAP_PAGE)(IN PXTBL_PAGE_MAPPING PageMap, IN ULONG_PTR VirtualAddress, IN ULONG_PTR PhysicalAddress, IN ULONG NumberOfPages);
|
typedef EFI_STATUS (XTCDECL *PBL_MAP_PAGE)(IN PXTBL_PAGE_MAPPING PageMap, IN ULONGLONG VirtualAddress, IN ULONGLONG PhysicalAddress, IN ULONGLONG NumberOfPages);
|
||||||
typedef EFI_STATUS (XTCDECL *PBL_MAP_VIRTUAL_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN PVOID VirtualAddress, IN PVOID PhysicalAddress, IN ULONGLONG NumberOfPages, IN LOADER_MEMORY_TYPE MemoryType);
|
typedef EFI_STATUS (XTCDECL *PBL_MAP_VIRTUAL_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN ULONGLONG VirtualAddress, IN ULONGLONG PhysicalAddress, IN ULONGLONG NumberOfPages, IN LOADER_MEMORY_TYPE MemoryType);
|
||||||
typedef VOID (XTAPI *PBL_MOVE_MEMORY)(IN OUT PVOID Destination, IN PCVOID Source, IN SIZE_T Length);
|
typedef VOID (XTAPI *PBL_MOVE_MEMORY)(IN OUT PVOID Destination, IN PCVOID Source, IN SIZE_T Length);
|
||||||
typedef EFI_STATUS (XTCDECL *PBL_OPEN_VOLUME)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, OUT PEFI_HANDLE DiskHandle, OUT PEFI_FILE_HANDLE *FsHandle);
|
typedef EFI_STATUS (XTCDECL *PBL_OPEN_VOLUME)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, OUT PEFI_HANDLE DiskHandle, OUT PEFI_FILE_HANDLE *FsHandle);
|
||||||
typedef EFI_STATUS (XTCDECL *PBL_OPEN_PROTOCOL)(OUT PEFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid);
|
typedef EFI_STATUS (XTCDECL *PBL_OPEN_PROTOCOL)(OUT PEFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid);
|
||||||
@@ -232,8 +237,8 @@ typedef struct _XTBL_KNOWN_BOOT_PROTOCOL
|
|||||||
typedef struct _XTBL_MEMORY_MAPPING
|
typedef struct _XTBL_MEMORY_MAPPING
|
||||||
{
|
{
|
||||||
LIST_ENTRY ListEntry;
|
LIST_ENTRY ListEntry;
|
||||||
PVOID VirtualAddress;
|
ULONGLONG VirtualAddress;
|
||||||
PVOID PhysicalAddress;
|
ULONGLONG PhysicalAddress;
|
||||||
ULONGLONG NumberOfPages;
|
ULONGLONG NumberOfPages;
|
||||||
LOADER_MEMORY_TYPE MemoryType;
|
LOADER_MEMORY_TYPE MemoryType;
|
||||||
} XTBL_MEMORY_MAPPING, *PXTBL_MEMORY_MAPPING;
|
} XTBL_MEMORY_MAPPING, *PXTBL_MEMORY_MAPPING;
|
||||||
@@ -449,6 +454,7 @@ typedef struct _XTBL_LOADER_PROTOCOL
|
|||||||
PBL_ALLOCATE_PAGES AllocatePages;
|
PBL_ALLOCATE_PAGES AllocatePages;
|
||||||
PBL_ALLOCATE_POOL AllocatePool;
|
PBL_ALLOCATE_POOL AllocatePool;
|
||||||
PBL_BUILD_PAGE_MAP BuildPageMap;
|
PBL_BUILD_PAGE_MAP BuildPageMap;
|
||||||
|
PBL_COMMIT_PAGE_MAP CommitPageMap;
|
||||||
PBL_COMPARE_MEMORY CompareMemory;
|
PBL_COMPARE_MEMORY CompareMemory;
|
||||||
PBL_COPY_MEMORY CopyMemory;
|
PBL_COPY_MEMORY CopyMemory;
|
||||||
PBL_FREE_PAGES FreePages;
|
PBL_FREE_PAGES FreePages;
|
||||||
@@ -518,4 +524,5 @@ typedef struct _XTBL_LOADER_PROTOCOL
|
|||||||
} WideString;
|
} WideString;
|
||||||
} XTBL_LOADER_PROTOCOL, *PXTBL_LOADER_PROTOCOL;
|
} XTBL_LOADER_PROTOCOL, *PXTBL_LOADER_PROTOCOL;
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_BLTYPES_H */
|
#endif /* __XTDK_BLTYPES_H */
|
||||||
|
|||||||
@@ -13,6 +13,9 @@
|
|||||||
#include <xttypes.h>
|
#include <xttypes.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* Kernel Executive routines forward references */
|
/* Kernel Executive routines forward references */
|
||||||
XTCLINK
|
XTCLINK
|
||||||
XTFASTCALL
|
XTFASTCALL
|
||||||
@@ -44,4 +47,5 @@ XTFASTCALL
|
|||||||
VOID
|
VOID
|
||||||
ExWaitForRundownProtectionRelease(IN PEX_RUNDOWN_REFERENCE Descriptor);
|
ExWaitForRundownProtectionRelease(IN PEX_RUNDOWN_REFERENCE Descriptor);
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_EXFUNCS_H */
|
#endif /* __XTDK_EXFUNCS_H */
|
||||||
|
|||||||
@@ -17,6 +17,10 @@
|
|||||||
/* Rundown protection flags */
|
/* Rundown protection flags */
|
||||||
#define EX_RUNDOWN_ACTIVE 0x1
|
#define EX_RUNDOWN_ACTIVE 0x1
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* Executive rundown protection structure definition */
|
/* Executive rundown protection structure definition */
|
||||||
typedef struct _EX_RUNDOWN_REFERENCE
|
typedef struct _EX_RUNDOWN_REFERENCE
|
||||||
{
|
{
|
||||||
@@ -34,4 +38,5 @@ typedef struct _EX_RUNDOWN_WAIT_BLOCK
|
|||||||
KEVENT WakeEvent;
|
KEVENT WakeEvent;
|
||||||
} EX_RUNDOWN_WAIT_BLOCK, *PEX_RUNDOWN_WAIT_BLOCK;
|
} EX_RUNDOWN_WAIT_BLOCK, *PEX_RUNDOWN_WAIT_BLOCK;
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_EXTYPES_H */
|
#endif /* __XTDK_EXTYPES_H */
|
||||||
|
|||||||
@@ -14,6 +14,9 @@
|
|||||||
#include <xttypes.h>
|
#include <xttypes.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* Hardware layer routines forward references */
|
/* Hardware layer routines forward references */
|
||||||
XTCLINK
|
XTCLINK
|
||||||
XTAPI
|
XTAPI
|
||||||
@@ -48,4 +51,5 @@ VOID
|
|||||||
HlWriteRegister32(IN PVOID Register,
|
HlWriteRegister32(IN PVOID Register,
|
||||||
IN ULONG Value);
|
IN ULONG Value);
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_HLFUNCS_H */
|
#endif /* __XTDK_HLFUNCS_H */
|
||||||
|
|||||||
@@ -101,6 +101,12 @@
|
|||||||
#define ACPI_MADT_PLACE_ENABLED 0 /* Processor Local APIC CPU Enabled */
|
#define ACPI_MADT_PLACE_ENABLED 0 /* Processor Local APIC CPU Enabled */
|
||||||
#define ACPI_MADT_PLAOC_ENABLED 1 /* Processor Local APIC Online Capable */
|
#define ACPI_MADT_PLAOC_ENABLED 1 /* Processor Local APIC Online Capable */
|
||||||
|
|
||||||
|
/* ACPI address space definitions */
|
||||||
|
#define ACPI_ADDRESS_SPACE_MEMORY 0x00
|
||||||
|
|
||||||
|
/* Maximum number of cached ACPI tables */
|
||||||
|
#define ACPI_MAX_CACHED_TABLES 32
|
||||||
|
|
||||||
/* Default serial port settings */
|
/* Default serial port settings */
|
||||||
#define COMPORT_CLOCK_RATE 0x1C200
|
#define COMPORT_CLOCK_RATE 0x1C200
|
||||||
#define COMPORT_WAIT_TIMEOUT 204800
|
#define COMPORT_WAIT_TIMEOUT 204800
|
||||||
@@ -179,6 +185,14 @@
|
|||||||
#define COMPORT_REG_MSR 0x06 /* Modem Status Register */
|
#define COMPORT_REG_MSR 0x06 /* Modem Status Register */
|
||||||
#define COMPORT_REG_SR 0x07 /* Scratch Register */
|
#define COMPORT_REG_SR 0x07 /* Scratch Register */
|
||||||
|
|
||||||
|
/* Minimum and maximum profile intervals */
|
||||||
|
#define MIN_PROFILE_INTERVAL 1000
|
||||||
|
#define MAX_PROFILE_INTERVAL 10000000
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* Generic Address structure */
|
/* Generic Address structure */
|
||||||
typedef struct _GENERIC_ADDRESS
|
typedef struct _GENERIC_ADDRESS
|
||||||
{
|
{
|
||||||
@@ -214,7 +228,7 @@ typedef struct _ACPI_SUBTABLE_HEADER
|
|||||||
typedef struct _ACPI_CACHE_LIST
|
typedef struct _ACPI_CACHE_LIST
|
||||||
{
|
{
|
||||||
LIST_ENTRY ListEntry;
|
LIST_ENTRY ListEntry;
|
||||||
ACPI_DESCRIPTION_HEADER Header;
|
PACPI_DESCRIPTION_HEADER Table;
|
||||||
} ACPI_CACHE_LIST, *PACPI_CACHE_LIST;
|
} ACPI_CACHE_LIST, *PACPI_CACHE_LIST;
|
||||||
|
|
||||||
/* ACPI Root System Description Table Pointer (RSDP) structure */
|
/* ACPI Root System Description Table Pointer (RSDP) structure */
|
||||||
@@ -305,6 +319,17 @@ typedef struct _ACPI_FADT
|
|||||||
GENERIC_ADDRESS SleepStatusReg;
|
GENERIC_ADDRESS SleepStatusReg;
|
||||||
} PACKED ACPI_FADT, *PACPI_FADT;
|
} PACKED ACPI_FADT, *PACPI_FADT;
|
||||||
|
|
||||||
|
/* ACPI High Precision Event Timer (HPET) table structure */
|
||||||
|
typedef struct _ACPI_HPET
|
||||||
|
{
|
||||||
|
ACPI_DESCRIPTION_HEADER Header;
|
||||||
|
ULONG EventTimerBlockId;
|
||||||
|
GENERIC_ADDRESS BaseAddress;
|
||||||
|
UCHAR HpetNumber;
|
||||||
|
USHORT MinimumTick;
|
||||||
|
UCHAR PageProtectionAndOem;
|
||||||
|
} PACKED ACPI_HPET, *PACPI_HPET;
|
||||||
|
|
||||||
/* ACPI Multiple APIC Description Table (MADT) structure */
|
/* ACPI Multiple APIC Description Table (MADT) structure */
|
||||||
typedef struct _ACPI_MADT
|
typedef struct _ACPI_MADT
|
||||||
{
|
{
|
||||||
@@ -314,6 +339,26 @@ typedef struct _ACPI_MADT
|
|||||||
ULONG ApicTables[];
|
ULONG ApicTables[];
|
||||||
} PACKED ACPI_MADT, *PACPI_MADT;
|
} PACKED ACPI_MADT, *PACPI_MADT;
|
||||||
|
|
||||||
|
/* ACPI Interrupt Override MADT subtable structure */
|
||||||
|
typedef struct _ACPI_MADT_INTERRUPT_OVERRIDE
|
||||||
|
{
|
||||||
|
ACPI_SUBTABLE_HEADER Header;
|
||||||
|
UCHAR Bus;
|
||||||
|
UCHAR SourceIrq;
|
||||||
|
ULONG GlobalSystemInterrupt;
|
||||||
|
USHORT Flags;
|
||||||
|
} PACKED ACPI_MADT_INTERRUPT_OVERRIDE, *PACPI_MADT_INTERRUPT_OVERRIDE;
|
||||||
|
|
||||||
|
/* ACPI IO APIC MADT subtable structure */
|
||||||
|
typedef struct _ACPI_MADT_IOAPIC
|
||||||
|
{
|
||||||
|
ACPI_SUBTABLE_HEADER Header;
|
||||||
|
UCHAR IoApicId;
|
||||||
|
UCHAR Reserved;
|
||||||
|
ULONG IoApicAddress;
|
||||||
|
ULONG GlobalIrqBase;
|
||||||
|
} PACKED ACPI_MADT_IOAPIC, *PACPI_MADT_IOAPIC;
|
||||||
|
|
||||||
/* ACPI Local APIC MADT subtable structure */
|
/* ACPI Local APIC MADT subtable structure */
|
||||||
typedef struct _ACPI_MADT_LOCAL_APIC
|
typedef struct _ACPI_MADT_LOCAL_APIC
|
||||||
{
|
{
|
||||||
@@ -450,4 +495,5 @@ typedef struct _SMBIOS3_TABLE_HEADER
|
|||||||
ULONGLONG TableAddress;
|
ULONGLONG TableAddress;
|
||||||
} SMBIOS3_TABLE_HEADER, *PSMBIOS3_TABLE_HEADER;
|
} SMBIOS3_TABLE_HEADER, *PSMBIOS3_TABLE_HEADER;
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_HLTYPES_H */
|
#endif /* __XTDK_HLTYPES_H */
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <xtdefs.h>
|
#include <xtdefs.h>
|
||||||
#include <xtstruct.h>
|
#include <xtstruct.h>
|
||||||
#include <xttypes.h>
|
#include <xttypes.h>
|
||||||
|
#include ARCH_HEADER(xtstruct.h)
|
||||||
|
|
||||||
|
|
||||||
/* Control Register 0 constants */
|
/* Control Register 0 constants */
|
||||||
@@ -92,6 +93,10 @@
|
|||||||
#define X86_EFLAGS_VIP_MASK 0x00100000 /* Virtual Interrupt Pending */
|
#define X86_EFLAGS_VIP_MASK 0x00100000 /* Virtual Interrupt Pending */
|
||||||
#define X86_EFLAGS_ID_MASK 0x00200000 /* Identification */
|
#define X86_EFLAGS_ID_MASK 0x00200000 /* Identification */
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* CPU vendor enumeration list */
|
/* CPU vendor enumeration list */
|
||||||
typedef enum _CPU_VENDOR
|
typedef enum _CPU_VENDOR
|
||||||
{
|
{
|
||||||
@@ -100,6 +105,18 @@ typedef enum _CPU_VENDOR
|
|||||||
CPU_VENDOR_UNKNOWN = 0xFFFFFFFF
|
CPU_VENDOR_UNKNOWN = 0xFFFFFFFF
|
||||||
} CPU_VENDOR, *PCPU_VENDOR;
|
} CPU_VENDOR, *PCPU_VENDOR;
|
||||||
|
|
||||||
|
/* CPUID advanced power management features (0x80000007) enumeration list */
|
||||||
|
typedef enum _CPUID_FEATURES_ADVANCED_POWER_MANAGEMENT
|
||||||
|
{
|
||||||
|
CPUID_FEATURES_EDX_TS = 1 << 0, /* Temperature Sensor */
|
||||||
|
CPUID_FEATURES_EDX_FIS = 1 << 1, /* Frequency ID Selection */
|
||||||
|
CPUID_FEATURES_EDX_VIS = 1 << 2, /* Voltage ID Selection */
|
||||||
|
CPUID_FEATURES_EDX_TTS = 1 << 3, /* ThermaTrip Support */
|
||||||
|
CPUID_FEATURES_EDX_HTC = 1 << 4, /* Hardware Thermal Throttling */
|
||||||
|
CPUID_FEATURES_EDX_STC = 1 << 5, /* Software Thermal Throttling */
|
||||||
|
CPUID_FEATURES_EDX_TSCI = 1 << 8 /* TSC Invariant */
|
||||||
|
} CPUID_FEATURES_ADVANCED_POWER_MANAGEMENT, *PCPUID_FEATURES_ADVANCED_POWER_MANAGEMENT;
|
||||||
|
|
||||||
/* CPUID extended features (0x80000001) enumeration list */
|
/* CPUID extended features (0x80000001) enumeration list */
|
||||||
typedef enum _CPUID_FEATURES_EXTENDED
|
typedef enum _CPUID_FEATURES_EXTENDED
|
||||||
{
|
{
|
||||||
@@ -141,6 +158,23 @@ typedef enum _CPUID_FEATURES_EXTENDED
|
|||||||
CPUID_FEATURES_EDX_3DNOW = 1 << 31
|
CPUID_FEATURES_EDX_3DNOW = 1 << 31
|
||||||
} CPUID_FEATURES_EXTENDED, *PCPUID_FEATURES_EXTENDED;
|
} CPUID_FEATURES_EXTENDED, *PCPUID_FEATURES_EXTENDED;
|
||||||
|
|
||||||
|
/* CPUID Thermal and Power Management features (0x00000006) enumeration list */
|
||||||
|
typedef enum _CPUID_FEATURES_POWER_MANAGEMENT
|
||||||
|
{
|
||||||
|
CPUID_FEATURES_EAX_DTHERM = 1 << 0,
|
||||||
|
CPUID_FEATURES_EAX_IDA = 1 << 1,
|
||||||
|
CPUID_FEATURES_EAX_ARAT = 1 << 2,
|
||||||
|
CPUID_FEATURES_EAX_PLN = 1 << 4,
|
||||||
|
CPUID_FEATURES_EAX_PTS = 1 << 6,
|
||||||
|
CPUID_FEATURES_EAX_HWP = 1 << 7,
|
||||||
|
CPUID_FEATURES_EAX_HWP_NOTIFY = 1 << 8,
|
||||||
|
CPUID_FEATURES_EAX_HWP_ACT_WINDOW = 1 << 9,
|
||||||
|
CPUID_FEATURES_EAX_HWP_EPP = 1 << 10,
|
||||||
|
CPUID_FEATURES_EAX_HWP_PKG_REQ = 1 << 11,
|
||||||
|
CPUID_FEATURES_EAX_HWP_HIGHEST_PERF_CHANGE = 1 << 15,
|
||||||
|
CPUID_FEATURES_EAX_HFI = 1 << 19
|
||||||
|
} CPUID_FEATURES_LEAF6, *PCPUID_FEATURES_LEAF6;
|
||||||
|
|
||||||
/* CPUID STD1 features (0x00000001) enumeration list */
|
/* CPUID STD1 features (0x00000001) enumeration list */
|
||||||
typedef enum _CPUID_FEATURES_STANDARD1
|
typedef enum _CPUID_FEATURES_STANDARD1
|
||||||
{
|
{
|
||||||
@@ -167,7 +201,7 @@ typedef enum _CPUID_FEATURES_STANDARD1
|
|||||||
CPUID_FEATURES_ECX_X2APIC = 1 << 21,
|
CPUID_FEATURES_ECX_X2APIC = 1 << 21,
|
||||||
CPUID_FEATURES_ECX_MOVBE = 1 << 22,
|
CPUID_FEATURES_ECX_MOVBE = 1 << 22,
|
||||||
CPUID_FEATURES_ECX_POPCNT = 1 << 23,
|
CPUID_FEATURES_ECX_POPCNT = 1 << 23,
|
||||||
CPUID_FEATURES_ECX_TSC = 1 << 24,
|
CPUID_FEATURES_ECX_TSC_DEADLINE = 1 << 24,
|
||||||
CPUID_FEATURES_ECX_AES = 1 << 25,
|
CPUID_FEATURES_ECX_AES = 1 << 25,
|
||||||
CPUID_FEATURES_ECX_XSAVE = 1 << 26,
|
CPUID_FEATURES_ECX_XSAVE = 1 << 26,
|
||||||
CPUID_FEATURES_ECX_OSXSAVE = 1 << 27,
|
CPUID_FEATURES_ECX_OSXSAVE = 1 << 27,
|
||||||
@@ -341,16 +375,23 @@ typedef enum _CPUID_FEATURES_STANDARD7_LEAF1
|
|||||||
/* CPUID requests */
|
/* CPUID requests */
|
||||||
typedef enum _CPUID_REQUESTS
|
typedef enum _CPUID_REQUESTS
|
||||||
{
|
{
|
||||||
CPUID_GET_VENDOR_STRING,
|
CPUID_GET_VENDOR_STRING = 0x00000000,
|
||||||
CPUID_GET_STANDARD1_FEATURES,
|
CPUID_GET_STANDARD1_FEATURES = 0x00000001,
|
||||||
CPUID_GET_TLB_CACHE,
|
CPUID_GET_TLB_CACHE = 0x00000002,
|
||||||
CPUID_GET_SERIAL,
|
CPUID_GET_SERIAL = 0x00000003,
|
||||||
CPUID_GET_CACHE_TOPOLOGY,
|
CPUID_GET_CACHE_TOPOLOGY = 0x00000004,
|
||||||
CPUID_GET_MONITOR_MWAIT,
|
CPUID_GET_MONITOR_MWAIT = 0x00000005,
|
||||||
CPUID_GET_POWER_MANAGEMENT,
|
CPUID_GET_POWER_MANAGEMENT = 0x00000006,
|
||||||
CPUID_GET_STANDARD7_FEATURES
|
CPUID_GET_STANDARD7_FEATURES = 0x00000007,
|
||||||
|
CPUID_GET_TSC_CRYSTAL_CLOCK = 0x00000015,
|
||||||
|
CPUID_GET_EXTENDED_MAX = 0x80000000,
|
||||||
|
CPUID_GET_EXTENDED_FEATURES = 0x80000001,
|
||||||
|
CPUID_GET_ADVANCED_POWER_MANAGEMENT = 0x80000007
|
||||||
} CPUID_REQUESTS, *PCPUID_REQUESTS;
|
} CPUID_REQUESTS, *PCPUID_REQUESTS;
|
||||||
|
|
||||||
|
/* Interrupt handler */
|
||||||
|
typedef VOID (*PINTERRUPT_HANDLER)(PKTRAP_FRAME TrapFrame);
|
||||||
|
|
||||||
/* Processor identification information */
|
/* Processor identification information */
|
||||||
typedef struct _CPU_IDENTIFICATION
|
typedef struct _CPU_IDENTIFICATION
|
||||||
{
|
{
|
||||||
@@ -390,4 +431,5 @@ typedef enum _TRAMPOLINE_TYPE
|
|||||||
TrampolineApStartup
|
TrampolineApStartup
|
||||||
} TRAMPOLINE_TYPE, *PTRAMPOLINE_TYPE;
|
} TRAMPOLINE_TYPE, *PTRAMPOLINE_TYPE;
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_I686_ARTYPES_H */
|
#endif /* __XTDK_I686_ARTYPES_H */
|
||||||
|
|||||||
@@ -15,6 +15,9 @@
|
|||||||
#include <i686/xtstruct.h>
|
#include <i686/xtstruct.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* Hardware layer routines forward references */
|
/* Hardware layer routines forward references */
|
||||||
XTCLINK
|
XTCLINK
|
||||||
XTCDECL
|
XTCDECL
|
||||||
@@ -49,4 +52,5 @@ VOID
|
|||||||
HlWritePort32(IN USHORT Port,
|
HlWritePort32(IN USHORT Port,
|
||||||
IN ULONG Value);
|
IN ULONG Value);
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_I686_HLFUNCS_H */
|
#endif /* __XTDK_I686_HLFUNCS_H */
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user