forked from xt-sys/exectos
Compare commits
425 Commits
cpuid-enha
...
smp
| Author | SHA1 | Date | |
|---|---|---|---|
|
a39835493a
|
|||
|
4e7113a079
|
|||
|
8080e07281
|
|||
|
fc0e1384c4
|
|||
|
9603453334
|
|||
|
29368a0dd8
|
|||
|
8ee97ac0ae
|
|||
|
6bbeb657ea
|
|||
|
c824e15cdb
|
|||
|
38b2e7a1ed
|
|||
|
efff262fb5
|
|||
|
8da6fefdc0
|
|||
|
14cbd63b01
|
|||
|
63d18aad1e
|
|||
|
ed52d421ea
|
|||
|
6df6a012d2
|
|||
|
ac675b037e
|
|||
|
ca4f3acc0e
|
|||
|
5b7761fe7d
|
|||
|
7a2a27b1b9
|
|||
|
1cff58c106
|
|||
|
9185ceade6
|
|||
|
908bc87b06
|
|||
|
6b852556a5
|
|||
|
ae18468bad
|
|||
|
42bbdc9b26
|
|||
|
b1ecdc3439
|
|||
|
fd7e18989d
|
|||
|
757eac08c6
|
|||
|
760e58f993
|
|||
|
c8868ead47
|
|||
|
58981e0087
|
|||
|
06635ed014
|
|||
|
5a92173586
|
|||
|
897d9d4099
|
|||
|
6b14f31107
|
|||
|
976eee9ce3
|
|||
|
689951cfde
|
|||
|
4cb5b12e68
|
|||
|
9761569e06
|
|||
|
100b58312f
|
|||
|
c5b0d15830
|
|||
|
8107692d83
|
|||
|
3262ad78c1
|
|||
|
85fb08b3d4
|
|||
|
0952dd80b2
|
|||
|
a3178e94bd
|
|||
|
f7554e0e24
|
|||
|
27440aefc4
|
|||
|
ba85c88544
|
|||
|
b417f84492
|
|||
|
48ef4bcdca
|
|||
|
7a28cf1c0a
|
|||
|
1050ddea8a
|
|||
|
a7151dbc89
|
|||
|
d532303b7f
|
|||
|
7017985682
|
|||
|
7aba8aa4ec
|
|||
|
d1eed619a7
|
|||
|
6cbda52d6b
|
|||
|
f03515b0eb
|
|||
|
03a9907bee
|
|||
|
49fde5adbd
|
|||
|
165e82f78b
|
|||
|
3ad10b8b07
|
|||
|
e2e2b05bc6
|
|||
|
98733aa62b
|
|||
|
58deafb1d8
|
|||
|
88d1f6f2ae
|
|||
|
6a983fe33c
|
|||
|
8d58a7fcc1
|
|||
|
13cf7b5fe7
|
|||
|
6a46dad9c5
|
|||
|
534aaba27e
|
|||
|
119679c996
|
|||
|
b1d013977f
|
|||
|
4d12f7ac01
|
|||
|
439ea891ca
|
|||
|
8ab3ddb8eb
|
|||
|
4afe678667
|
|||
|
3b76146d53
|
|||
|
341759a325
|
|||
|
122bae21a2
|
|||
|
5dc782ca24
|
|||
|
f2baa765b4
|
|||
|
2dd1fdf869
|
|||
|
b1e849a251
|
|||
|
58010c27f4
|
|||
|
98f2f449f9
|
|||
|
76ee56c762
|
|||
|
ba41ad8f0b
|
|||
|
a217391338
|
|||
|
5824e9d366
|
|||
|
57bd3d505e
|
|||
|
d6c2dabcbb
|
|||
|
1f733c120c
|
|||
|
735ccd96a6
|
|||
|
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
|
@@ -55,17 +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(boot)
|
add_subdirectory(boot)
|
||||||
add_subdirectory(bootdata)
|
|
||||||
add_subdirectory(drivers)
|
add_subdirectory(drivers)
|
||||||
add_subdirectory(sdk)
|
add_subdirectory(sdk)
|
||||||
add_subdirectory(xtldr)
|
|
||||||
add_subdirectory(xtoskrnl)
|
add_subdirectory(xtoskrnl)
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
9
IDEAS.md
9
IDEAS.md
@@ -1,9 +0,0 @@
|
|||||||
## ExectOS Ideas
|
|
||||||
This is a list of ideas that migh but not must be realized.
|
|
||||||
|
|
||||||
### 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.
|
|
||||||
15
README.md
15
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 |
|
||||||
|
| boot/bootsect | boot sector code (MBR & VBR) initializing the boot process |
|
||||||
|
| boot/xtldr | XTOS boot loader source code |
|
||||||
| drivers | XT native drivers source code |
|
| drivers | XT native drivers source code |
|
||||||
| sdk/cmake | Host toolchain configuration and build-related functions |
|
| sdk/cmake | host toolchain configuration and build-related functions |
|
||||||
|
| sdk/firmware | firmware enabling XTOS to boot on virtual machines |
|
||||||
| sdk/xtdk | XT Software Development Kit headers |
|
| sdk/xtdk | XT Software Development Kit headers |
|
||||||
| services | integral subsystems services source code |
|
| services | integral subsystems services source code |
|
||||||
| subsystems | environment subsystems source code |
|
| subsystems | environment subsystems source code |
|
||||||
| xtoskrnl | XTOS kernel source code |
|
| xtoskrnl | XTOS kernel source code |
|
||||||
| xtldr | XTOS boot loader source code |
|
|
||||||
|
|
||||||
# Build
|
# Build
|
||||||
XTOS can only be built using [XTchain](https://git.codingworkshop.eu.org/xt-sys/xtchain), a dedicated toolchain designed
|
XTOS can only be built using [XTchain](https://git.codingworkshop.eu.org/xt-sys/xtchain), a dedicated toolchain designed
|
||||||
|
|||||||
@@ -1 +1,3 @@
|
|||||||
|
add_subdirectory(bootdata)
|
||||||
add_subdirectory(bootsect)
|
add_subdirectory(bootsect)
|
||||||
|
add_subdirectory(xtldr)
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
# XT Boot Sector
|
# XT Boot Sector
|
||||||
PROJECT(BOOTSECT)
|
PROJECT(BOOTSECT)
|
||||||
|
|
||||||
|
add_definitions("-DARCH_ESP_SOURCE=\\\"${ARCH}/cpu.S\\\"")
|
||||||
|
|
||||||
# Compile boot sectors
|
# Compile boot sectors
|
||||||
compile_bootsector(mbrboot ${BOOTSECT_SOURCE_DIR}/mbrboot.S 0x7C00 Start)
|
compile_bootsector(mbrboot ${BOOTSECT_SOURCE_DIR}/mbrboot.S 0x7C00 Start)
|
||||||
compile_bootsector(espboot ${BOOTSECT_SOURCE_DIR}/espboot.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"
|
||||||
@@ -84,30 +84,446 @@ RealStart:
|
|||||||
leaw -16(%bp), %sp
|
leaw -16(%bp), %sp
|
||||||
sti
|
sti
|
||||||
|
|
||||||
/* Print message */
|
/* Get drive number */
|
||||||
movw $msgUnavailable, %si
|
cmpb $0xFF, DriveNumber - Start(%bp)
|
||||||
call Print
|
jne GetDriveParameters
|
||||||
|
movb %dl, DriveNumber - Start(%bp)
|
||||||
|
|
||||||
/* Wait for key press and reboot */
|
GetDriveParameters:
|
||||||
xorw %ax, %ax
|
/* Get drive parameters from the BIOS */
|
||||||
int $0x16
|
movb DriveNumber - Start(%bp), %dl
|
||||||
int $0x19
|
movb $0x08, %ah
|
||||||
|
movb $0x00, %al
|
||||||
|
int $0x13
|
||||||
|
jnc GetDriveSize
|
||||||
|
movw $0xFFFF, %cx
|
||||||
|
movb %cl, %dh
|
||||||
|
|
||||||
|
GetDriveSize:
|
||||||
|
/* Get drive size from the BIOS */
|
||||||
|
movzbl %dh, %eax
|
||||||
|
incw %ax
|
||||||
|
movzbl %cl, %edx
|
||||||
|
andb $0x3F, %dl
|
||||||
|
mulw %dx
|
||||||
|
xchgb %cl, %ch
|
||||||
|
shrb $0x06, %ch
|
||||||
|
incw %cx
|
||||||
|
movzwl %cx, %ecx
|
||||||
|
mull %ecx
|
||||||
|
movl %eax, %edi
|
||||||
|
|
||||||
|
VerifyBiosParameterBlock:
|
||||||
|
/* Verify the FAT32 BPB */
|
||||||
|
cmpw $0x00, SectorsPerFat - Start(%bp)
|
||||||
|
jne FsError
|
||||||
|
cmpw $0x00, FsVersion - Start(%bp)
|
||||||
|
ja FsError
|
||||||
|
|
||||||
|
ReadExtraCode:
|
||||||
|
/* Read second VBR sector with extra boot code (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:
|
Print:
|
||||||
/* Simple routine to print messages */
|
/* Simple routine to print messages */
|
||||||
lodsb
|
lodsb
|
||||||
orb %al, %al
|
orb %al, %al
|
||||||
jz DonePrint
|
jz .DonePrint
|
||||||
movb $0x0E, %ah
|
movb $0x0E, %ah
|
||||||
movw $0x07, %bx
|
movw $0x07, %bx
|
||||||
int $0x10
|
int $0x10
|
||||||
jmp Print
|
jmp Print
|
||||||
DonePrint:
|
.DonePrint:
|
||||||
retw
|
retw
|
||||||
|
|
||||||
msgUnavailable:
|
Reboot:
|
||||||
.ascii "XTLDR requires EFI-based system!\r\nPress any key to restart\r\n"
|
/* Display a message, wait for a key press and reboot */
|
||||||
|
movw $.MsgAnyKey, %si
|
||||||
|
call Print
|
||||||
|
xorw %ax, %ax
|
||||||
|
int $0x16
|
||||||
|
int $0x19
|
||||||
|
|
||||||
|
.MsgAnyKey:
|
||||||
|
.ascii "Press any key to restart...\r\n\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 the rest of the VBR with zeros and add VBR signature at the end */
|
||||||
.fill (510 - (. - Start)), 1, 0
|
.fill (510 - (. - Start)), 1, 0
|
||||||
.word 0xAA55
|
.word 0xAA55
|
||||||
|
|
||||||
|
|
||||||
|
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"
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
* FILE: boot/bootsect/amd64/mbrboot.S
|
* FILE: boot/bootsect/amd64/mbrboot.S
|
||||||
* DESCRIPTION: XT Boot Loader MBR boot code
|
* DESCRIPTION: XT Boot Loader MBR boot code
|
||||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||||
|
* Aiken Harris <aiken@codingworkshop.eu.org>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.text
|
.text
|
||||||
@@ -41,7 +42,7 @@ RealStart:
|
|||||||
movw %ax, %ss
|
movw %ax, %ss
|
||||||
|
|
||||||
/* Print welcome message */
|
/* Print welcome message */
|
||||||
leaw msgXtosBoot, %si
|
leaw .MsgXtosBoot, %si
|
||||||
call Print
|
call Print
|
||||||
|
|
||||||
/* Get BIOS boot drive and partition table offset */
|
/* Get BIOS boot drive and partition table offset */
|
||||||
@@ -90,19 +91,19 @@ PartitionFound:
|
|||||||
|
|
||||||
InvalidSignature:
|
InvalidSignature:
|
||||||
/* Invalid signature error */
|
/* Invalid signature error */
|
||||||
leaw msgInvalidSignature, %si
|
leaw .MsgInvalidSignature, %si
|
||||||
call Print
|
call Print
|
||||||
jmp HaltSystem
|
jmp HaltSystem
|
||||||
|
|
||||||
PartitionNotFound:
|
PartitionNotFound:
|
||||||
/* Active partition not found error */
|
/* Active partition not found error */
|
||||||
leaw msgPartitionNotFound, %si
|
leaw .MsgPartitionNotFound, %si
|
||||||
call Print
|
call Print
|
||||||
jmp HaltSystem
|
jmp HaltSystem
|
||||||
|
|
||||||
VbrReadFail:
|
VbrReadFail:
|
||||||
/* VBR read failed error */
|
/* VBR read failed error */
|
||||||
leaw msgVbrReadFail, %si
|
leaw .MsgVbrReadFail, %si
|
||||||
call Print
|
call Print
|
||||||
jmp HaltSystem
|
jmp HaltSystem
|
||||||
|
|
||||||
@@ -136,16 +137,16 @@ DonePrint:
|
|||||||
/* Storage for the LBA start */
|
/* Storage for the LBA start */
|
||||||
.long 0
|
.long 0
|
||||||
|
|
||||||
msgInvalidSignature:
|
.MsgInvalidSignature:
|
||||||
.asciz "Invalid partition signature!"
|
.asciz "Invalid partition signature!"
|
||||||
|
|
||||||
msgPartitionNotFound:
|
.MsgPartitionNotFound:
|
||||||
.asciz "Bootable partition not found!"
|
.asciz "Bootable partition not found!"
|
||||||
|
|
||||||
msgVbrReadFail:
|
.MsgVbrReadFail:
|
||||||
.asciz "VBR read failed!"
|
.asciz "VBR read failed!"
|
||||||
|
|
||||||
msgXtosBoot:
|
.MsgXtosBoot:
|
||||||
.asciz "Starting XTOS boot loader...\r\n"
|
.asciz "Starting XTOS boot loader...\r\n"
|
||||||
|
|
||||||
/* Fill the rest of the MBR with zeros and add MBR signature at the end */
|
/* Fill the rest of the MBR with zeros and add MBR signature at the end */
|
||||||
|
|||||||
@@ -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));
|
||||||
|
}
|
||||||
@@ -221,10 +221,15 @@ Console::QueryMode(OUT PUINT_PTR ResX,
|
|||||||
* @since XT 1.0
|
* @since XT 1.0
|
||||||
*/
|
*/
|
||||||
XTCDECL
|
XTCDECL
|
||||||
VOID
|
EFI_STATUS
|
||||||
Console::ReadKeyStroke(OUT PEFI_INPUT_KEY Key)
|
Console::ReadKeyStroke(OUT PEFI_INPUT_KEY Key)
|
||||||
{
|
{
|
||||||
XtLoader::GetEfiSystemTable()->ConIn->ReadKeyStroke(XtLoader::GetEfiSystemTable()->ConIn, Key);
|
/* Clear the key structure to prevent ghost keystrokes */
|
||||||
|
Key->ScanCode = 0;
|
||||||
|
Key->UnicodeChar = 0;
|
||||||
|
|
||||||
|
/* Read the keystroke from the EFI input console */
|
||||||
|
return XtLoader::GetEfiSystemTable()->ConIn->ReadKeyStroke(XtLoader::GetEfiSystemTable()->ConIn, Key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -44,6 +56,21 @@ XTBL_LOADER_PROTOCOL Protocol::LoaderProtocol;
|
|||||||
/* XT Boot Loader loaded modules list */
|
/* XT Boot Loader loaded modules list */
|
||||||
LIST_ENTRY Protocol::LoadedModules;
|
LIST_ENTRY Protocol::LoadedModules;
|
||||||
|
|
||||||
|
/* XT Boot Loader shell exit flag */
|
||||||
|
BOOLEAN Shell::ExitRequest;
|
||||||
|
|
||||||
|
/* XT Boot Loader shell history buffer */
|
||||||
|
WCHAR Shell::History[XTBL_SH_HISTORY_ENTRIES][XTBL_SH_MAX_LINE_LENGTH];
|
||||||
|
|
||||||
|
/* XT Boot Loader shell history count */
|
||||||
|
ULONG Shell::HistoryCount = 0;
|
||||||
|
|
||||||
|
/* XT Boot Loader shell history index */
|
||||||
|
ULONG Shell::HistoryIndex = 0;
|
||||||
|
|
||||||
|
/* XT Boot Loader shell commands list */
|
||||||
|
LIST_ENTRY Shell::ShellCommands;
|
||||||
|
|
||||||
/* List of available block devices */
|
/* List of available block devices */
|
||||||
LIST_ENTRY Volume::EfiBlockDevices;
|
LIST_ENTRY Volume::EfiBlockDevices;
|
||||||
|
|
||||||
@@ -15,6 +15,25 @@
|
|||||||
#include <libxtos.hh>
|
#include <libxtos.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:
|
||||||
@@ -74,7 +93,7 @@ class Console
|
|||||||
STATIC XTCDECL XTSTATUS PutChar(IN WCHAR Character);
|
STATIC XTCDECL XTSTATUS PutChar(IN WCHAR Character);
|
||||||
STATIC XTCDECL VOID QueryMode(OUT PUINT_PTR ResX,
|
STATIC XTCDECL VOID QueryMode(OUT PUINT_PTR ResX,
|
||||||
OUT PUINT_PTR ResY);
|
OUT PUINT_PTR ResY);
|
||||||
STATIC XTCDECL VOID ReadKeyStroke(OUT PEFI_INPUT_KEY Key);
|
STATIC XTCDECL EFI_STATUS ReadKeyStroke(OUT PEFI_INPUT_KEY Key);
|
||||||
STATIC XTCDECL VOID ResetInputBuffer();
|
STATIC XTCDECL VOID ResetInputBuffer();
|
||||||
STATIC XTCDECL VOID SetAttributes(IN ULONGLONG Attributes);
|
STATIC XTCDECL VOID SetAttributes(IN ULONGLONG Attributes);
|
||||||
STATIC XTCDECL VOID SetCursorPosition(IN ULONGLONG PosX,
|
STATIC XTCDECL VOID SetCursorPosition(IN ULONGLONG PosX,
|
||||||
@@ -146,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);
|
||||||
@@ -158,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,
|
||||||
@@ -232,11 +253,47 @@ class Protocol
|
|||||||
|
|
||||||
class Shell
|
class Shell
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
STATIC BOOLEAN ExitRequest;
|
||||||
|
STATIC WCHAR History[XTBL_SH_HISTORY_ENTRIES][XTBL_SH_MAX_LINE_LENGTH];
|
||||||
|
STATIC ULONG HistoryCount;
|
||||||
|
STATIC ULONG HistoryIndex;
|
||||||
|
STATIC LIST_ENTRY ShellCommands;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
STATIC XTCDECL EFI_STATUS RegisterCommand(IN PCWSTR Command,
|
||||||
|
IN PCWSTR Description,
|
||||||
|
IN PBL_SHELL_COMMAND Handler);
|
||||||
STATIC XTCDECL VOID StartLoaderShell();
|
STATIC XTCDECL VOID StartLoaderShell();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
STATIC XTCDECL VOID CommandExit(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv);
|
||||||
|
STATIC XTCDECL VOID CommandHelp(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv);
|
||||||
|
STATIC XTCDECL VOID CommandInsmod(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv);
|
||||||
|
STATIC XTCDECL VOID CommandLsmod(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv);
|
||||||
|
STATIC XTCDECL VOID CommandPoweroff(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv);
|
||||||
|
STATIC XTCDECL VOID CommandReboot(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv);
|
||||||
|
STATIC XTCDECL VOID CommandVersion(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv);
|
||||||
|
STATIC XTCDECL VOID ExecuteCommand(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv);
|
||||||
|
STATIC XTCDECL EFI_STATUS ParseCommand(IN PWCHAR CommandLine,
|
||||||
|
OUT PULONG Argc,
|
||||||
|
OUT PWCHAR **Argv);
|
||||||
STATIC XTCDECL VOID PrintPrompt();
|
STATIC XTCDECL VOID PrintPrompt();
|
||||||
|
STATIC XTCDECL VOID PrintPromptLine(IN PWCHAR Buffer,
|
||||||
|
IN ULONG BufferLength,
|
||||||
|
IN ULONG CursorPosition,
|
||||||
|
IN ULONG PreviousBufferLength);
|
||||||
|
STATIC XTCDECL VOID ReadCommand(OUT PWCHAR Buffer,
|
||||||
|
IN ULONG BufferSize);
|
||||||
|
STATIC XTCDECL VOID RegisterBuiltinCommands();
|
||||||
};
|
};
|
||||||
|
|
||||||
class TextUi
|
class TextUi
|
||||||
@@ -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)
|
||||||
|
{
|
||||||
|
/* 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);
|
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,34 +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;
|
||||||
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;
|
||||||
@@ -450,24 +479,33 @@ Xtos::InitializeLoaderBlock(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
LoaderBlock->FirmwareInformation.EfiFirmware.EfiRuntimeServices = NULLPTR;
|
LoaderBlock->FirmwareInformation.EfiFirmware.EfiRuntimeServices = NULLPTR;
|
||||||
|
|
||||||
/* 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;
|
||||||
@@ -607,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");
|
||||||
@@ -628,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)
|
||||||
@@ -650,8 +700,8 @@ 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,
|
||||||
LoaderSystemCode);
|
LoaderSystemCode);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
@@ -670,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;
|
||||||
|
|
||||||
@@ -302,6 +302,7 @@ Protocol::LoadModule(IN PWCHAR ModuleName)
|
|||||||
PXTBL_MODULE_DEPS ModuleDependency;
|
PXTBL_MODULE_DEPS ModuleDependency;
|
||||||
PXTBL_MODULE_INFO ModuleInfo;
|
PXTBL_MODULE_INFO ModuleInfo;
|
||||||
WCHAR ModuleFileName[24];
|
WCHAR ModuleFileName[24];
|
||||||
|
ULONG ModuleNameLength;
|
||||||
USHORT SectionIndex;
|
USHORT SectionIndex;
|
||||||
PWCHAR SectionData;
|
PWCHAR SectionData;
|
||||||
SIZE_T ModuleSize;
|
SIZE_T ModuleSize;
|
||||||
@@ -328,8 +329,11 @@ Protocol::LoadModule(IN PWCHAR ModuleName)
|
|||||||
/* Print debug message */
|
/* Print debug message */
|
||||||
Debug::Print(L"Loading module '%S' ...\n", ModuleName);
|
Debug::Print(L"Loading module '%S' ...\n", ModuleName);
|
||||||
|
|
||||||
|
/* Calculate module name length */
|
||||||
|
ModuleNameLength = RTL::WideString::WideStringLength(ModuleName, 0) + 1;
|
||||||
|
|
||||||
/* Set module path */
|
/* Set module path */
|
||||||
RTL::Memory::CopyMemory(ModuleFileName, ModuleName, (RTL::WideString::WideStringLength(ModuleName, 0) + 1) * sizeof(WCHAR));
|
RTL::Memory::CopyMemory(ModuleFileName, ModuleName, ModuleNameLength * sizeof(WCHAR));
|
||||||
RTL::WideString::ConcatenateWideString(ModuleFileName, (PWCHAR)L".EFI", 0);
|
RTL::WideString::ConcatenateWideString(ModuleFileName, (PWCHAR)L".EFI", 0);
|
||||||
|
|
||||||
/* Open EFI volume */
|
/* Open EFI volume */
|
||||||
@@ -438,7 +442,8 @@ Protocol::LoadModule(IN PWCHAR ModuleName)
|
|||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Failed to load module, print error message and return status code */
|
/* Failed to load module, print error message and return status code */
|
||||||
Debug::Print(L"Failed to load dependency module '%S' (Status Code: 0x%zX)\n", ModuleDependency->ModuleName, Status);
|
Debug::Print(L"Failed to load dependency module '%S' (Status Code: 0x%zX)\n",
|
||||||
|
ModuleDependency->ModuleName, Status);
|
||||||
return STATUS_EFI_UNSUPPORTED;
|
return STATUS_EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -501,8 +506,19 @@ Protocol::LoadModule(IN PWCHAR ModuleName)
|
|||||||
XtLoader::GetEfiSystemTable()->BootServices->CloseProtocol(LoadedImage, &LIPGuid, LoadedImage, NULLPTR);
|
XtLoader::GetEfiSystemTable()->BootServices->CloseProtocol(LoadedImage, &LIPGuid, LoadedImage, NULLPTR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Allocate memory for module name */
|
||||||
|
Status = Memory::AllocatePool(ModuleNameLength * sizeof(WCHAR), (PVOID *)&ModuleInfo->ModuleName);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Failed to allocate memory for module name, return error */
|
||||||
|
Debug::Print(L"ERROR: Failed to allocate memory (Status Code: 0x%zX)\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy module name */
|
||||||
|
RTL::Memory::CopyMemory(ModuleInfo->ModuleName, ModuleName, ModuleNameLength * sizeof(WCHAR));
|
||||||
|
|
||||||
/* Save additional module information, not found in '.modinfo' section */
|
/* Save additional module information, not found in '.modinfo' section */
|
||||||
ModuleInfo->ModuleName = ModuleName;
|
|
||||||
ModuleInfo->ModuleBase = LoadedImage->ImageBase;
|
ModuleInfo->ModuleBase = LoadedImage->ImageBase;
|
||||||
ModuleInfo->ModuleSize = LoadedImage->ImageSize;
|
ModuleInfo->ModuleSize = LoadedImage->ImageSize;
|
||||||
ModuleInfo->Revision = LoadedImage->Revision;
|
ModuleInfo->Revision = LoadedImage->Revision;
|
||||||
@@ -1054,6 +1070,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;
|
||||||
@@ -1076,6 +1093,7 @@ Protocol::InstallXtLoaderProtocol()
|
|||||||
LoaderProtocol.Protocol.LocateHandles = LocateProtocolHandles;
|
LoaderProtocol.Protocol.LocateHandles = LocateProtocolHandles;
|
||||||
LoaderProtocol.Protocol.Open = OpenProtocol;
|
LoaderProtocol.Protocol.Open = OpenProtocol;
|
||||||
LoaderProtocol.Protocol.OpenHandle = OpenProtocolHandle;
|
LoaderProtocol.Protocol.OpenHandle = OpenProtocolHandle;
|
||||||
|
LoaderProtocol.Shell.RegisterCommand = Shell::RegisterCommand;
|
||||||
LoaderProtocol.String.Compare = RTL::String::CompareString;
|
LoaderProtocol.String.Compare = RTL::String::CompareString;
|
||||||
LoaderProtocol.String.Length = RTL::String::StringLength;
|
LoaderProtocol.String.Length = RTL::String::StringLength;
|
||||||
LoaderProtocol.String.ToWideString = RTL::String::StringToWideString;
|
LoaderProtocol.String.ToWideString = RTL::String::StringToWideString;
|
||||||
931
boot/xtldr/shell.cc
Normal file
931
boot/xtldr/shell.cc
Normal file
@@ -0,0 +1,931 @@
|
|||||||
|
/**
|
||||||
|
* PROJECT: ExectOS
|
||||||
|
* COPYRIGHT: See COPYING.md in the top level directory
|
||||||
|
* FILE: xtldr/shell.cc
|
||||||
|
* DESCRIPTION: XT Boot Loader shell
|
||||||
|
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||||
|
* Aiken Harris <harraiken91@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xtldr.hh>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements the built-in `exit` command. Sets the exit flag to signal the main
|
||||||
|
* shell loop to terminate and return control to the boot menu.
|
||||||
|
*
|
||||||
|
* @param Argc
|
||||||
|
* Supplies the number of arguments provided by the user.
|
||||||
|
*
|
||||||
|
* @param Argv
|
||||||
|
* Supplies a list of arguments provided by the user.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
Shell::CommandExit(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv)
|
||||||
|
{
|
||||||
|
/* Signal the main shell loop to stop and return to the boot menu */
|
||||||
|
ExitRequest = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements the built-in `help` command. Prints a list of available commands alongside their descriptions.
|
||||||
|
*
|
||||||
|
* @param Argc
|
||||||
|
* Supplies the number of arguments provided by the user.
|
||||||
|
*
|
||||||
|
* @param Argv
|
||||||
|
* Supplies a list of arguments provided by the user.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
Shell::CommandHelp(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv)
|
||||||
|
{
|
||||||
|
PXTBL_SHELL_COMMAND CommandEntry;
|
||||||
|
PLIST_ENTRY ListEntry;
|
||||||
|
|
||||||
|
/* Print a header line */
|
||||||
|
Console::Print(L"Available commands:\n\n");
|
||||||
|
|
||||||
|
/* Walk the registered commands list */
|
||||||
|
ListEntry = ShellCommands.Flink;
|
||||||
|
while(ListEntry != &ShellCommands)
|
||||||
|
{
|
||||||
|
/* Retrieve the current command entry */
|
||||||
|
CommandEntry = CONTAIN_RECORD(ListEntry, XTBL_SHELL_COMMAND, Flink);
|
||||||
|
|
||||||
|
/* Print the command name in a highlighted color */
|
||||||
|
Console::SetAttributes(EFI_TEXT_BGCOLOR_BLACK | EFI_TEXT_FGCOLOR_WHITE);
|
||||||
|
Console::Print(L" %-12S", CommandEntry->Command);
|
||||||
|
|
||||||
|
/* Print the description in the default color */
|
||||||
|
Console::SetAttributes(EFI_TEXT_BGCOLOR_BLACK | EFI_TEXT_FGCOLOR_LIGHTGRAY);
|
||||||
|
Console::Print(L" %S\n", CommandEntry->Description);
|
||||||
|
|
||||||
|
/* Advance to the next entry */
|
||||||
|
ListEntry = ListEntry->Flink;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements the built-in `insmod` command. Loads an XTLDR module by its name.
|
||||||
|
*
|
||||||
|
* @param Argc
|
||||||
|
* Supplies the number of arguments provided by the user.
|
||||||
|
*
|
||||||
|
* @param Argv
|
||||||
|
* Supplies a list of arguments provided by the user.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
Shell::CommandInsmod(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
/* Check if the module name was provided */
|
||||||
|
if(Argc != 2)
|
||||||
|
{
|
||||||
|
/* Print usage message and return */
|
||||||
|
Console::Print(L"Usage: insmod <module_name>\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Load the module */
|
||||||
|
Status = Protocol::LoadModule(Argv[1]);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Failed to load module, print error message */
|
||||||
|
Console::Print(L"ERROR: Failed to load module '%S' (Status: 0x%llx).\n", Argv[1], Status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements the built-in `lsmod` command. Lists all loaded XTLDR modules.
|
||||||
|
*
|
||||||
|
* @param Argc
|
||||||
|
* Supplies the number of arguments provided by the user.
|
||||||
|
*
|
||||||
|
* @param Argv
|
||||||
|
* Supplies a list of arguments provided by the user.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
Shell::CommandLsmod(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv)
|
||||||
|
{
|
||||||
|
PXTBL_MODULE_INFO ModuleInfo;
|
||||||
|
PLIST_ENTRY ModulesList;
|
||||||
|
PLIST_ENTRY ListEntry;
|
||||||
|
|
||||||
|
/* Print header */
|
||||||
|
Console::Print(L"Module Name Version Base Address Size\n");
|
||||||
|
Console::Print(L"----------------------------------------------------------------------\n");
|
||||||
|
|
||||||
|
/* Get modules list */
|
||||||
|
ModulesList = Protocol::GetModulesList();
|
||||||
|
if(ModulesList == NULLPTR)
|
||||||
|
{
|
||||||
|
/* No modules loaded */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Iterate over all loaded modules */
|
||||||
|
ListEntry = ModulesList->Flink;
|
||||||
|
while(ListEntry != ModulesList)
|
||||||
|
{
|
||||||
|
/* Retrieve the module information */
|
||||||
|
ModuleInfo = CONTAIN_RECORD(ListEntry, XTBL_MODULE_INFO, Flink);
|
||||||
|
|
||||||
|
/* Print module information */
|
||||||
|
Console::Print(L"%-16S %-16S 0x%016llx %llu\n",
|
||||||
|
ModuleInfo->ModuleName, ModuleInfo->Version,
|
||||||
|
(ULONGLONG)ModuleInfo->ModuleBase, ModuleInfo->ModuleSize);
|
||||||
|
|
||||||
|
/* Advance to the next entry */
|
||||||
|
ListEntry = ListEntry->Flink;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements the built-in `poweroff` command. Shuts down the machine.
|
||||||
|
*
|
||||||
|
* @param Argc
|
||||||
|
* Supplies the number of arguments provided by the user.
|
||||||
|
*
|
||||||
|
* @param Argv
|
||||||
|
* Supplies a list of arguments provided by the user.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
Shell::CommandPoweroff(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv)
|
||||||
|
{
|
||||||
|
/* Attempt to power off the machine */
|
||||||
|
Console::Print(L"Powering off...\n");
|
||||||
|
EfiUtils::ShutdownSystem();
|
||||||
|
|
||||||
|
/* The poweroff call failed, print error message */
|
||||||
|
Console::Print(L"ERROR: Failed to power off the machine\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements the built-in `reboot` command. Performs a normal system restart via the EFI runtime services.
|
||||||
|
* When the '/EFI' parameter is supplied, the routine instead schedules a reboot into the UEFI firmware setup interface.
|
||||||
|
*
|
||||||
|
* @param Argc
|
||||||
|
* Supplies the number of arguments provided by the user.
|
||||||
|
*
|
||||||
|
* @param Argv
|
||||||
|
* Supplies a list of arguments provided by the user.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
Shell::CommandReboot(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv)
|
||||||
|
{
|
||||||
|
/* Check if the /EFI flag was specified */
|
||||||
|
if(Argc > 1 && RTL::WideString::CompareWideStringInsensitive(Argv[1], L"/EFI", 0) == 0)
|
||||||
|
{
|
||||||
|
/* Attempt to reboot into firmware setup */
|
||||||
|
Console::Print(L"Rebooting into UEFI firmware setup...\n");
|
||||||
|
EfiUtils::EnterFirmwareSetup();
|
||||||
|
|
||||||
|
/* The firmware does not support this feature, print error message */
|
||||||
|
Console::Print(L"ERROR: Reboot into firmware setup interface not supported.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Perform a standard system reboot */
|
||||||
|
Console::Print(L"Rebooting...\n");
|
||||||
|
EfiUtils::RebootSystem();
|
||||||
|
|
||||||
|
/* The reboot call failed, print error message */
|
||||||
|
Console::Print(L"ERROR: Failed to reboot the machine\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements the built-in `ver` command. Prints the bootloader identification string.
|
||||||
|
*
|
||||||
|
* @param Argc
|
||||||
|
* Supplies the number of arguments provided by the user.
|
||||||
|
*
|
||||||
|
* @param Argv
|
||||||
|
* Supplies a list of arguments provided by the user.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
Shell::CommandVersion(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv)
|
||||||
|
{
|
||||||
|
/* Check if debugging enabled */
|
||||||
|
if(DEBUG)
|
||||||
|
{
|
||||||
|
/* Print debug version of XTLDR version string */
|
||||||
|
Console::Print(L"XTLDR Boot Loader v%d.%d (%s-%s)\n",
|
||||||
|
XTLDR_VERSION_MAJOR, XTLDR_VERSION_MINOR, XTOS_VERSION_DATE, XTOS_VERSION_HASH);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Print standard XTLDR version string */
|
||||||
|
Console::Print(L"XTLDR Boot Loader v%d.%d\n", XTLDR_VERSION_MAJOR, XTLDR_VERSION_MINOR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Looks up the given command name in the registered shell commands list and invokes the corresponding handler.
|
||||||
|
*
|
||||||
|
* @param Argc
|
||||||
|
* Supplies the number of arguments in the argument vector, including the command name itself.
|
||||||
|
*
|
||||||
|
* @param Argv
|
||||||
|
* Supplies a pointer to the argument vector. First argument is the command name.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
Shell::ExecuteCommand(IN ULONG Argc,
|
||||||
|
IN PWCHAR *Argv)
|
||||||
|
{
|
||||||
|
PXTBL_SHELL_COMMAND CommandEntry;
|
||||||
|
PLIST_ENTRY ListEntry;
|
||||||
|
|
||||||
|
/* Walk through the list of registered shell commands */
|
||||||
|
ListEntry = ShellCommands.Flink;
|
||||||
|
while(ListEntry != &ShellCommands)
|
||||||
|
{
|
||||||
|
/* Retrieve the shell command entry from the list node */
|
||||||
|
CommandEntry = CONTAIN_RECORD(ListEntry, XTBL_SHELL_COMMAND, Flink);
|
||||||
|
|
||||||
|
/* Perform a case-insensitive comparison against the command name */
|
||||||
|
if(RTL::WideString::CompareWideStringInsensitive(CommandEntry->Command, Argv[0], 0) == 0)
|
||||||
|
{
|
||||||
|
/* Command matches, invoke its handler and return */
|
||||||
|
CommandEntry->Handler(Argc, Argv);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Advance to the next registered command */
|
||||||
|
ListEntry = ListEntry->Flink;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* No matching command was found, print error message */
|
||||||
|
Console::Print(L"ERROR: '%S' is not recognized as a valid command.\n", Argv[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Splits the supplied raw command line string into an argument count and an argument vector suitable
|
||||||
|
* for command dispatch. The input string is tokenized by whitespace.
|
||||||
|
*
|
||||||
|
* @param CommandLine
|
||||||
|
* Supplies a mutable wide-character string containing the raw command line.
|
||||||
|
*
|
||||||
|
* @param Argc
|
||||||
|
* Receives the number of arguments found in the command line.
|
||||||
|
*
|
||||||
|
* @param Argv
|
||||||
|
* Receives a pointer to an allocated array of wide-character string pointers, one for each argument.
|
||||||
|
*
|
||||||
|
* @return This routine returns a status code.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
EFI_STATUS
|
||||||
|
Shell::ParseCommand(IN PWCHAR CommandLine,
|
||||||
|
OUT PULONG Argc,
|
||||||
|
OUT PWCHAR **Argv)
|
||||||
|
{
|
||||||
|
PWCHAR *ArgumentVector, TempLine;
|
||||||
|
ULONG ArgumentCount;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
/* Initialize argument count */
|
||||||
|
ArgumentCount = 0;
|
||||||
|
|
||||||
|
/* Count the tokens to determine the size of the argument vector */
|
||||||
|
TempLine = CommandLine;
|
||||||
|
while(*TempLine != L'\0')
|
||||||
|
{
|
||||||
|
/* Skip leading spaces */
|
||||||
|
while(*TempLine == L' ')
|
||||||
|
{
|
||||||
|
/* Move to the next character */
|
||||||
|
TempLine++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if the end of the string was reached */
|
||||||
|
if(*TempLine == L'\0')
|
||||||
|
{
|
||||||
|
/* End of the string, break the loop */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* One more argument found */
|
||||||
|
ArgumentCount++;
|
||||||
|
|
||||||
|
/* Skip the characters of the token */
|
||||||
|
while(*TempLine != L'\0' && *TempLine != L' ')
|
||||||
|
{
|
||||||
|
/* Move to the next character */
|
||||||
|
TempLine++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if the command line was empty */
|
||||||
|
if(ArgumentCount == 0)
|
||||||
|
{
|
||||||
|
/* Set argument count and vector to zero and NULL */
|
||||||
|
*Argc = 0;
|
||||||
|
*Argv = NULLPTR;
|
||||||
|
|
||||||
|
/* Return success */
|
||||||
|
return STATUS_EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate memory for the argument vector */
|
||||||
|
Status = Memory::AllocatePool(ArgumentCount * sizeof(PWCHAR), (PVOID *)&ArgumentVector);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Memory allocation failure, return status code */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reset argument count and temp line */
|
||||||
|
ArgumentCount = 0;
|
||||||
|
TempLine = CommandLine;
|
||||||
|
|
||||||
|
/* Walk through the command line */
|
||||||
|
while(*TempLine != L'\0')
|
||||||
|
{
|
||||||
|
/* Skip leading whitespace */
|
||||||
|
while(*TempLine == L' ')
|
||||||
|
{
|
||||||
|
/* Move to the next character */
|
||||||
|
TempLine++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if the end of the string was reached */
|
||||||
|
if(*TempLine == L'\0')
|
||||||
|
{
|
||||||
|
/* End of string reached, break the loop */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Record token */
|
||||||
|
ArgumentVector[ArgumentCount] = TempLine;
|
||||||
|
ArgumentCount++;
|
||||||
|
|
||||||
|
/* Advance past the token characters */
|
||||||
|
while(*TempLine != L'\0' && *TempLine != L' ')
|
||||||
|
{
|
||||||
|
/* Move to the next character */
|
||||||
|
TempLine++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if token was NULL-terminated */
|
||||||
|
if(*TempLine != L'\0')
|
||||||
|
{
|
||||||
|
/* NULL-terminate the token and move to the next character */
|
||||||
|
*TempLine = L'\0';
|
||||||
|
TempLine++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return results to the caller */
|
||||||
|
*Argc = ArgumentCount;
|
||||||
|
*Argv = ArgumentVector;
|
||||||
|
return STATUS_EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints XTLDR shell prompt.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
Shell::PrintPrompt()
|
||||||
|
{
|
||||||
|
/* Set prompt color */
|
||||||
|
Console::SetAttributes(EFI_TEXT_BGCOLOR_BLACK | EFI_TEXT_FGCOLOR_YELLOW);
|
||||||
|
|
||||||
|
/* Print prompt at the start of the line */
|
||||||
|
Console::Print(L"\rXTLDR> ");
|
||||||
|
|
||||||
|
/* Reset standard shell colors */
|
||||||
|
Console::SetAttributes(EFI_TEXT_BGCOLOR_BLACK | EFI_TEXT_FGCOLOR_LIGHTGRAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints the whole prompt line, including the current command line and the cursor position.
|
||||||
|
*
|
||||||
|
* @param Buffer
|
||||||
|
* Supplies a pointer to the buffer containing the command line.
|
||||||
|
*
|
||||||
|
* @param BufferLength
|
||||||
|
* Supplies the buffer text length.
|
||||||
|
*
|
||||||
|
* @param CursorPosition
|
||||||
|
* Supplies the current cursor position.
|
||||||
|
*
|
||||||
|
* @param PreviousBufferLength
|
||||||
|
* Supplies the previous buffer text length to clear artifacts.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
Shell::PrintPromptLine(IN PWCHAR Buffer,
|
||||||
|
IN ULONG BufferLength,
|
||||||
|
IN ULONG CursorPosition,
|
||||||
|
IN ULONG PreviousBufferLength)
|
||||||
|
{
|
||||||
|
INT32 TargetX, TargetY;
|
||||||
|
WCHAR SavedChar;
|
||||||
|
ULONG Index;
|
||||||
|
|
||||||
|
/* Print the prompt */
|
||||||
|
PrintPrompt();
|
||||||
|
|
||||||
|
/* Temporarily truncate the string to capture cursor position */
|
||||||
|
SavedChar = Buffer[CursorPosition];
|
||||||
|
Buffer[CursorPosition] = L'\0';
|
||||||
|
|
||||||
|
/* Print up to the cursor position */
|
||||||
|
Console::Print(L"%S", Buffer);
|
||||||
|
|
||||||
|
/* Capture target cursor coordinates from the EFI text mode structure */
|
||||||
|
TargetX = XtLoader::GetEfiSystemTable()->ConOut->Mode->CursorColumn;
|
||||||
|
TargetY = XtLoader::GetEfiSystemTable()->ConOut->Mode->CursorRow;
|
||||||
|
|
||||||
|
/* Restore the character and print the remainder of the buffer */
|
||||||
|
Buffer[CursorPosition] = SavedChar;
|
||||||
|
Console::Print(L"%S", Buffer + CursorPosition);
|
||||||
|
|
||||||
|
/* Check if the previous buffer was longer than the current one */
|
||||||
|
if(PreviousBufferLength > BufferLength)
|
||||||
|
{
|
||||||
|
/* Clear artifacts from the previous longer line */
|
||||||
|
for(Index = 0; Index < (PreviousBufferLength - BufferLength); Index++)
|
||||||
|
{
|
||||||
|
/* Print a white space */
|
||||||
|
Console::Print(L" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Move the cursor back to the correct target position */
|
||||||
|
Console::SetCursorPosition(TargetX, TargetY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a complete line of input from the shell console into the supplied buffer.
|
||||||
|
*
|
||||||
|
* @param Buffer
|
||||||
|
* Supplies a pointer to a wide-character buffer that receives the entered command line.
|
||||||
|
*
|
||||||
|
* @param BufferSize
|
||||||
|
* Supplies the capacity of the buffer, in wide characters.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
Shell::ReadCommand(OUT PWCHAR Buffer,
|
||||||
|
IN ULONG BufferSize)
|
||||||
|
{
|
||||||
|
ULONG BufferLength, CursorPosition, OldBufferLength;
|
||||||
|
UINT_PTR EventIndex;
|
||||||
|
EFI_INPUT_KEY Key;
|
||||||
|
|
||||||
|
/* Start with an empty buffer */
|
||||||
|
CursorPosition = 0;
|
||||||
|
BufferLength = 0;
|
||||||
|
Buffer[0] = L'\0';
|
||||||
|
|
||||||
|
/* Reset history index */
|
||||||
|
HistoryIndex = HistoryCount;
|
||||||
|
|
||||||
|
/* Read characters until the user submits the command line */
|
||||||
|
while(TRUE)
|
||||||
|
{
|
||||||
|
/* Wait until a key event is available */
|
||||||
|
EfiUtils::WaitForEfiEvent(1, &(XtLoader::GetEfiSystemTable()->ConIn->WaitForKey), &EventIndex);
|
||||||
|
|
||||||
|
/* Read the keystroke from the input device */
|
||||||
|
Console::ReadKeyStroke(&Key);
|
||||||
|
|
||||||
|
/* Capture the previous line length to wipe possible artifacts */
|
||||||
|
OldBufferLength = BufferLength;
|
||||||
|
|
||||||
|
/* Check the keystroke */
|
||||||
|
if(Key.UnicodeChar == 0x0D)
|
||||||
|
{
|
||||||
|
/* ENTER key pressed, terminate the buffer and move to a new line */
|
||||||
|
Buffer[BufferLength] = L'\0';
|
||||||
|
Console::Print(L"\n");
|
||||||
|
|
||||||
|
/* Check if the buffer is not empty */
|
||||||
|
if(BufferLength > 0)
|
||||||
|
{
|
||||||
|
/* Check if the history is not full */
|
||||||
|
if(HistoryCount < XTBL_SH_HISTORY_ENTRIES)
|
||||||
|
{
|
||||||
|
/* Store command in history and increment history count */
|
||||||
|
RTL::Memory::CopyMemory(History[HistoryCount], Buffer, (BufferLength + 1) * sizeof(WCHAR));
|
||||||
|
HistoryCount++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Shift history entries to fit new command */
|
||||||
|
RTL::Memory::MoveMemory(History[0],
|
||||||
|
History[1],
|
||||||
|
(XTBL_SH_HISTORY_ENTRIES - 1) * XTBL_SH_MAX_LINE_LENGTH * sizeof(WCHAR));
|
||||||
|
RTL::Memory::CopyMemory(History[XTBL_SH_HISTORY_ENTRIES - 1],
|
||||||
|
Buffer,
|
||||||
|
(BufferLength + 1) * sizeof(WCHAR));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the command line to the caller */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if(Key.ScanCode == 0x01)
|
||||||
|
{
|
||||||
|
/* UP key pressed, go back in history */
|
||||||
|
if(HistoryIndex > 0)
|
||||||
|
{
|
||||||
|
/* Decrement history index */
|
||||||
|
HistoryIndex--;
|
||||||
|
|
||||||
|
/* Copy history entry to buffer and update cursor position */
|
||||||
|
BufferLength = RTL::WideString::WideStringLength(History[HistoryIndex], XTBL_SH_MAX_LINE_LENGTH - 1);
|
||||||
|
RTL::Memory::CopyMemory(Buffer, History[HistoryIndex], (BufferLength + 1) * sizeof(WCHAR));
|
||||||
|
CursorPosition = BufferLength;
|
||||||
|
|
||||||
|
/* Reprint the prompt line */
|
||||||
|
PrintPromptLine(Buffer, BufferLength, CursorPosition, OldBufferLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Continue to the next iteration */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(Key.ScanCode == 0x02)
|
||||||
|
{
|
||||||
|
/* DOWN key pressed, go forward in history */
|
||||||
|
if(HistoryIndex < HistoryCount)
|
||||||
|
{
|
||||||
|
/* Increment history index */
|
||||||
|
HistoryIndex++;
|
||||||
|
|
||||||
|
/* Check if we are at the end of history */
|
||||||
|
if(HistoryIndex == HistoryCount)
|
||||||
|
{
|
||||||
|
/* End of history, show empty prompt */
|
||||||
|
Buffer[0] = L'\0';
|
||||||
|
BufferLength = 0;
|
||||||
|
CursorPosition = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Copy history entry to buffer and update cursor position */
|
||||||
|
BufferLength = RTL::WideString::WideStringLength(History[HistoryIndex],
|
||||||
|
XTBL_SH_MAX_LINE_LENGTH - 1);
|
||||||
|
RTL::Memory::CopyMemory(Buffer, History[HistoryIndex], (BufferLength + 1) * sizeof(WCHAR));
|
||||||
|
CursorPosition = BufferLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reprint the prompt line */
|
||||||
|
PrintPromptLine(Buffer, BufferLength, CursorPosition, OldBufferLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Continue to the next iteration */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(Key.ScanCode == 0x03)
|
||||||
|
{
|
||||||
|
/* RIGHT key pressed, move cursor right */
|
||||||
|
if(CursorPosition < BufferLength)
|
||||||
|
{
|
||||||
|
/* Increment cursor position */
|
||||||
|
CursorPosition++;
|
||||||
|
|
||||||
|
/* Reprint the prompt line */
|
||||||
|
PrintPromptLine(Buffer, BufferLength, CursorPosition, OldBufferLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Continue to the next iteration */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(Key.ScanCode == 0x04)
|
||||||
|
{
|
||||||
|
/* LEFT key pressed, move cursor left */
|
||||||
|
if(CursorPosition > 0)
|
||||||
|
{
|
||||||
|
/* Decrement cursor position */
|
||||||
|
CursorPosition--;
|
||||||
|
|
||||||
|
/* Reprint the prompt line */
|
||||||
|
PrintPromptLine(Buffer, BufferLength, CursorPosition, OldBufferLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Continue to the next iteration */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(Key.ScanCode == 0x05)
|
||||||
|
{
|
||||||
|
/* HOME key pressed, move cursor to beginning */
|
||||||
|
if (CursorPosition > 0)
|
||||||
|
{
|
||||||
|
/* Set cursor position to beginning of the line and reprint the prompt line */
|
||||||
|
CursorPosition = 0;
|
||||||
|
PrintPromptLine(Buffer, BufferLength, CursorPosition, OldBufferLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Continue to the next iteration */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(Key.ScanCode == 0x06)
|
||||||
|
{
|
||||||
|
/* END key pressed, move cursor to end */
|
||||||
|
if (CursorPosition < BufferLength)
|
||||||
|
{
|
||||||
|
/* Set cursor position to end of the line and reprint the prompt line */
|
||||||
|
CursorPosition = BufferLength;
|
||||||
|
PrintPromptLine(Buffer, BufferLength, CursorPosition, OldBufferLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Continue to the next iteration */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(Key.ScanCode == 0x17)
|
||||||
|
{
|
||||||
|
/* ESC key pressed, discard the current input, move to a new line and reprint the prompt */
|
||||||
|
Buffer[0] = L'\0';
|
||||||
|
Console::Print(L"\n");
|
||||||
|
PrintPrompt();
|
||||||
|
|
||||||
|
/* Reset cursor position, buffer length and history index */
|
||||||
|
CursorPosition = 0;
|
||||||
|
BufferLength = 0;
|
||||||
|
HistoryIndex = HistoryCount;
|
||||||
|
|
||||||
|
/* Continue reading the command line */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(Key.ScanCode == 0x08)
|
||||||
|
{
|
||||||
|
/* DELETE key pressed, remove character at cursor */
|
||||||
|
if(CursorPosition < BufferLength)
|
||||||
|
{
|
||||||
|
/* Move memory to remove the character at cursor */
|
||||||
|
RTL::Memory::MoveMemory(Buffer + CursorPosition,
|
||||||
|
Buffer + CursorPosition + 1,
|
||||||
|
(BufferLength - CursorPosition) * sizeof(WCHAR));
|
||||||
|
|
||||||
|
/* Decrement buffer length and reprint the prompt line */
|
||||||
|
BufferLength--;
|
||||||
|
PrintPromptLine(Buffer, BufferLength, CursorPosition, OldBufferLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Continue to the next iteration */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(Key.UnicodeChar == 0x08)
|
||||||
|
{
|
||||||
|
/* BACKSPACE key pressed, delete character before cursor */
|
||||||
|
if(CursorPosition > 0)
|
||||||
|
{
|
||||||
|
/* Move memory to remove the character before cursor */
|
||||||
|
RTL::Memory::MoveMemory(Buffer + CursorPosition - 1,
|
||||||
|
Buffer + CursorPosition,
|
||||||
|
(BufferLength - CursorPosition + 1) * sizeof(WCHAR));
|
||||||
|
|
||||||
|
/* Decrement cursor position and buffer length */
|
||||||
|
CursorPosition--;
|
||||||
|
BufferLength--;
|
||||||
|
|
||||||
|
/* Reprint the prompt line */
|
||||||
|
PrintPromptLine(Buffer, BufferLength, CursorPosition, OldBufferLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Continue reading the command line */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(Key.UnicodeChar == 0)
|
||||||
|
{
|
||||||
|
/* Ignore non-printable characters */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure there is room in the buffer (reserve one slot for NULL terminator) */
|
||||||
|
if(BufferLength < BufferSize - 1)
|
||||||
|
{
|
||||||
|
/* Insert character in the middle or end of the buffer */
|
||||||
|
RTL::Memory::MoveMemory(Buffer + CursorPosition + 1,
|
||||||
|
Buffer + CursorPosition,
|
||||||
|
(BufferLength - CursorPosition + 1) * sizeof(WCHAR));
|
||||||
|
Buffer[CursorPosition] = Key.UnicodeChar;
|
||||||
|
|
||||||
|
/* Increment cursor position and buffer length */
|
||||||
|
CursorPosition++;
|
||||||
|
BufferLength++;
|
||||||
|
|
||||||
|
/* Reprint the prompt line */
|
||||||
|
PrintPromptLine(Buffer, BufferLength, CursorPosition, OldBufferLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a new command in the XTLDR shell.
|
||||||
|
*
|
||||||
|
* @param Command
|
||||||
|
* Supplies the command keyword that the user types at the shell prompt.
|
||||||
|
*
|
||||||
|
* @param Description
|
||||||
|
* Supplies a short help string displayed by the 'help' command.
|
||||||
|
*
|
||||||
|
* @param Handler
|
||||||
|
* Supplies a pointer to the function that implements the command.
|
||||||
|
*
|
||||||
|
* @return This routine returns a status code.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
EFI_STATUS
|
||||||
|
Shell::RegisterCommand(IN PCWSTR Command,
|
||||||
|
IN PCWSTR Description,
|
||||||
|
IN PBL_SHELL_COMMAND Handler)
|
||||||
|
{
|
||||||
|
PXTBL_SHELL_COMMAND CommandEntry;
|
||||||
|
PLIST_ENTRY ListEntry;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
/* Verify that a command with this name has not already been registered */
|
||||||
|
ListEntry = ShellCommands.Flink;
|
||||||
|
while(ListEntry != &ShellCommands)
|
||||||
|
{
|
||||||
|
/* Retrieve the existing shell command entry */
|
||||||
|
CommandEntry = CONTAIN_RECORD(ListEntry, XTBL_SHELL_COMMAND, Flink);
|
||||||
|
|
||||||
|
/* Compare command names case-insensitively */
|
||||||
|
if(RTL::WideString::CompareWideStringInsensitive(CommandEntry->Command, Command, 0) == 0)
|
||||||
|
{
|
||||||
|
/* Duplicate command name, return error */
|
||||||
|
return STATUS_EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Advance to the next entry */
|
||||||
|
ListEntry = ListEntry->Flink;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate memory for the new command entry */
|
||||||
|
Status = Memory::AllocatePool(sizeof(XTBL_SHELL_COMMAND), (PVOID *)&CommandEntry);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Memory allocation failure, return error */
|
||||||
|
return STATUS_EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Populate the new command entry */
|
||||||
|
CommandEntry->Command = (PWCHAR)Command;
|
||||||
|
CommandEntry->Description = (PWCHAR)Description;
|
||||||
|
CommandEntry->Handler = Handler;
|
||||||
|
|
||||||
|
/* Append the command to the global shell commands list */
|
||||||
|
RTL::LinkedList::InsertTailList(&ShellCommands, &CommandEntry->Flink);
|
||||||
|
|
||||||
|
/* Return success */
|
||||||
|
return STATUS_EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers all built-in shell commands that are provided by the XTLDR.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
Shell::RegisterBuiltinCommands()
|
||||||
|
{
|
||||||
|
/* Register all built-in shell commands */
|
||||||
|
RegisterCommand(L"exit", L"Exits the shell and returns to the boot menu", CommandExit);
|
||||||
|
RegisterCommand(L"help", L"Displays a list of all available shell commands", CommandHelp);
|
||||||
|
RegisterCommand(L"insmod", L"Loads a specific XTLDR module", CommandInsmod);
|
||||||
|
RegisterCommand(L"lsmod", L"Displays a list of loaded modules", CommandLsmod);
|
||||||
|
RegisterCommand(L"poweroff", L"Shuts down the machine", CommandPoweroff);
|
||||||
|
RegisterCommand(L"reboot", L"Reboots the machine (/EFI to enter firmware setup)", CommandReboot);
|
||||||
|
RegisterCommand(L"ver", L"Displays the boot loader version information", CommandVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the command list, registers the built-in commands and enters an interactive XTLDR shell loop.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
VOID
|
||||||
|
Shell::StartLoaderShell()
|
||||||
|
{
|
||||||
|
WCHAR CommandLine[XTBL_SH_MAX_LINE_LENGTH];
|
||||||
|
PWCHAR *ArgumentVector;
|
||||||
|
ULONG ArgumentCount;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
/* Initialize console */
|
||||||
|
Console::InitializeConsole();
|
||||||
|
|
||||||
|
/* Initialize the shell commands list */
|
||||||
|
RTL::LinkedList::InitializeListHead(&ShellCommands);
|
||||||
|
|
||||||
|
/* Register all built-in commands */
|
||||||
|
RegisterBuiltinCommands();
|
||||||
|
|
||||||
|
/* Clear the shell exit request flag */
|
||||||
|
ExitRequest = FALSE;
|
||||||
|
|
||||||
|
/* Main XTLDR shell loop */
|
||||||
|
while(!ExitRequest)
|
||||||
|
{
|
||||||
|
/* Display the shell prompt */
|
||||||
|
PrintPrompt();
|
||||||
|
|
||||||
|
/* Read a command line */
|
||||||
|
ReadCommand(CommandLine, XTBL_SH_MAX_LINE_LENGTH);
|
||||||
|
|
||||||
|
/* Parse the command line into a list of arguments */
|
||||||
|
Status = ParseCommand(CommandLine, &ArgumentCount, &ArgumentVector);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Parsing failed, print error and continue */
|
||||||
|
Console::Print(L"ERROR: Failed to parse command line (Status: 0x%llx).\n\n", Status);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if command line is empty */
|
||||||
|
if(ArgumentCount == 0)
|
||||||
|
{
|
||||||
|
/* Skip empty command line */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if command line starts with a comment symbol (#) */
|
||||||
|
if(ArgumentVector[0][0] != L'#')
|
||||||
|
{
|
||||||
|
/* Dispatch the command */
|
||||||
|
ExecuteCommand(ArgumentCount, ArgumentVector);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free the argument vector */
|
||||||
|
Memory::FreePool(ArgumentVector);
|
||||||
|
|
||||||
|
/* Print a trailing blank line for visual separation */
|
||||||
|
Console::Print(L"\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -717,9 +717,9 @@ TextUi::DisplayEditMenu(IN PXTBL_BOOTMENU_ITEM MenuEntry)
|
|||||||
RedrawEntries = TRUE;
|
RedrawEntries = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(Key.UnicodeChar == 0x02)
|
else if(Key.ScanCode == 0x14)
|
||||||
{
|
{
|
||||||
/* CTRL-B key pressed, boot the OS */
|
/* F10 key pressed, boot the OS */
|
||||||
Console::SetAttributes(Handle.DialogColor | Handle.TextColor);
|
Console::SetAttributes(Handle.DialogColor | Handle.TextColor);
|
||||||
Console::ClearLine(Handle.PosY + Handle.Height + 4);
|
Console::ClearLine(Handle.PosY + Handle.Height + 4);
|
||||||
Console::SetCursorPosition(4, Handle.PosY + Handle.Height + 4);
|
Console::SetCursorPosition(4, Handle.PosY + Handle.Height + 4);
|
||||||
@@ -1673,7 +1673,7 @@ TextUi::DrawEditMenu(OUT PXTBL_DIALOG_HANDLE Handle)
|
|||||||
Console::SetCursorPosition(0, Handle->PosY + Handle->Height);
|
Console::SetCursorPosition(0, Handle->PosY + Handle->Height);
|
||||||
Console::SetAttributes(EFI_TEXT_BGCOLOR_BLACK | EFI_TEXT_FGCOLOR_LIGHTGRAY);
|
Console::SetAttributes(EFI_TEXT_BGCOLOR_BLACK | EFI_TEXT_FGCOLOR_LIGHTGRAY);
|
||||||
Console::Print(L" Use cursors to change the selection. Press ENTER key to edit the chosen\n"
|
Console::Print(L" Use cursors to change the selection. Press ENTER key to edit the chosen\n"
|
||||||
L" option, ESC to return to the main boot menu or CTRL-B to boot.\n");
|
L" option, ESC to return to the main boot menu or F10 to boot.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -236,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)
|
||||||
|
|||||||
@@ -23,36 +23,57 @@ endif()
|
|||||||
|
|
||||||
find_program(QEMU_EMULATOR ${QEMU_COMMAND})
|
find_program(QEMU_EMULATOR ${QEMU_COMMAND})
|
||||||
if(QEMU_EMULATOR)
|
if(QEMU_EMULATOR)
|
||||||
|
if(CMAKE_HOST_LINUX)
|
||||||
# This target starts up a QEMU+OVMF virtual machine using KVM accelerator
|
# This target starts up a QEMU+OVMF virtual machine using KVM accelerator
|
||||||
add_custom_target(testefikvm
|
add_custom_target(testefikvm
|
||||||
DEPENDS install
|
DEPENDS install
|
||||||
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-EFI-KVM" -machine type=q35,kernel_irqchip=on,accel="kvm:whpx",mem-merge=off,vmport=off -enable-kvm -cpu host,-hypervisor,+topoext
|
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
|
||||||
-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 -M smm=off -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)
|
||||||
|
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(testefitcg
|
add_custom_target(testefitcg
|
||||||
DEPENDS install
|
DEPENDS install
|
||||||
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-EFI-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 -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
|
# This target starts up a QEMU+SEABIOS virtual machine using KVM accelerator
|
||||||
add_custom_target(testkvm
|
add_custom_target(testkvm
|
||||||
DEPENDS diskimg
|
DEPENDS diskimg
|
||||||
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-BIOS-KVM" -machine type=q35,kernel_irqchip=on,accel="kvm:whpx",mem-merge=off,vmport=off -enable-kvm -cpu host,-hypervisor,+topoext
|
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
|
-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
|
-hda ${EXECTOS_BINARY_DIR}/output/disk.img
|
||||||
-boot menu=on -d int -no-reboot -no-shutdown -serial stdio
|
-boot menu=on -d int -no-reboot -no-shutdown -serial stdio
|
||||||
VERBATIM USES_TERMINAL)
|
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
|
# This target starts up a QEMU+SEABIOS virtual machine using TCG accelerator
|
||||||
add_custom_target(testtcg
|
add_custom_target(testtcg
|
||||||
|
|||||||
@@ -59,16 +59,103 @@ 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 compiles XT Assembly Development Kit
|
||||||
|
function(generate_xtadk TARGET_NAME SOURCE_FILES)
|
||||||
|
# Define the absolute destination path for the generated header file
|
||||||
|
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()
|
||||||
|
|
||||||
|
# Retrieve compiler definitions, include paths, and options
|
||||||
|
get_directory_property(COMPILE_DEFINITIONS COMPILE_DEFINITIONS)
|
||||||
|
get_directory_property(INCLUDE_DIRECTORIES INCLUDE_DIRECTORIES)
|
||||||
|
get_directory_property(COMPILE_OPTIONS COMPILE_OPTIONS)
|
||||||
|
|
||||||
|
# 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
|
# This function compiles an assembly bootsector file into a flat binary
|
||||||
function(compile_bootsector NAME SOURCE BASEADDR ENTRYPOINT)
|
function(compile_bootsector NAME SOURCE BASEADDR ENTRYPOINT)
|
||||||
set(BINARY_NAME "${NAME}.bin")
|
set(BINARY_NAME "${NAME}.bin")
|
||||||
set(OBJECT_NAME "${NAME}.obj")
|
set(OBJECT_NAME "${NAME}.obj")
|
||||||
|
|
||||||
|
get_directory_property(DEFS COMPILE_DEFINITIONS)
|
||||||
|
foreach(def ${DEFS})
|
||||||
|
list(APPEND ASM_DEFS "-D${def}")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}
|
||||||
COMMAND ${CMAKE_ASM_COMPILER}
|
COMMAND ${CMAKE_ASM_COMPILER}
|
||||||
/nologo
|
/nologo
|
||||||
--target=i386-none-elf
|
--target=i386-none-elf
|
||||||
|
${ASM_DEFS}
|
||||||
|
-I${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
/Fo${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_NAME}
|
/Fo${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_NAME}
|
||||||
-c -- ${SOURCE}
|
-c -- ${SOURCE}
|
||||||
COMMAND ${CMAKE_ASM_LINKER}
|
COMMAND ${CMAKE_ASM_LINKER}
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
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}")
|
||||||
91
sdk/xtadk/amd64/ke.cc
Normal file
91
sdk/xtadk/amd64/ke.cc
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
|
||||||
|
/* Generate PROCESSOR_START_BLOCK offsets */
|
||||||
|
ADK_OFFSET(PROCESSOR_START_BLOCK, Cr3);
|
||||||
|
ADK_OFFSET(PROCESSOR_START_BLOCK, Cr4);
|
||||||
|
ADK_OFFSET(PROCESSOR_START_BLOCK, EntryPoint);
|
||||||
|
ADK_OFFSET(PROCESSOR_START_BLOCK, ProcessorStructures);
|
||||||
|
ADK_OFFSET(PROCESSOR_START_BLOCK, Stack);
|
||||||
|
ADK_OFFSET(PROCESSOR_START_BLOCK, Started);
|
||||||
|
}
|
||||||
65
sdk/xtadk/i686/ke.cc
Normal file
65
sdk/xtadk/i686/ke.cc
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
|
||||||
|
/* Generate PROCESSOR_START_BLOCK offsets */
|
||||||
|
ADK_OFFSET(PROCESSOR_START_BLOCK, Cr3);
|
||||||
|
ADK_OFFSET(PROCESSOR_START_BLOCK, Cr4);
|
||||||
|
ADK_OFFSET(PROCESSOR_START_BLOCK, EntryPoint);
|
||||||
|
ADK_OFFSET(PROCESSOR_START_BLOCK, ProcessorStructures);
|
||||||
|
ADK_OFFSET(PROCESSOR_START_BLOCK, Stack);
|
||||||
|
ADK_OFFSET(PROCESSOR_START_BLOCK, Started);
|
||||||
|
}
|
||||||
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,31 +410,33 @@ 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
|
||||||
{
|
{
|
||||||
|
ULONGLONG ExtendedFeatureBits;
|
||||||
USHORT Family;
|
USHORT Family;
|
||||||
|
ULONGLONG FeatureBits;
|
||||||
USHORT Model;
|
USHORT Model;
|
||||||
USHORT Stepping;
|
USHORT Stepping;
|
||||||
CPU_VENDOR Vendor;
|
CPU_VENDOR Vendor;
|
||||||
UCHAR VendorName[13];
|
UCHAR VendorName[13];
|
||||||
UINT32 StandardFeaturesEcx;
|
|
||||||
UINT32 StandardFeaturesEdx;
|
|
||||||
UINT32 ExtendedFeaturesEcx;
|
|
||||||
UINT32 ExtendedFeaturesEdx;
|
|
||||||
UINT32 Standard7FeaturesEbx;
|
|
||||||
UINT32 Standard7FeaturesEcx;
|
|
||||||
UINT32 Standard7FeaturesEdx;
|
|
||||||
} CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
|
} CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
|
||||||
|
|
||||||
/* CPUID registers */
|
/* CPUID registers */
|
||||||
@@ -433,4 +469,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,87 @@
|
|||||||
/* PIC vector definitions */
|
/* PIC vector definitions */
|
||||||
#define PIC1_VECTOR_SPURIOUS 0x37
|
#define PIC1_VECTOR_SPURIOUS 0x37
|
||||||
|
|
||||||
|
/* HPET General Capabilities definitions */
|
||||||
|
#define HPET_CAPABILITY_64BIT 0x2000ULL
|
||||||
|
#define HPET_CAPABILITY_LEGACY_REPLACEMENT 0x8000ULL
|
||||||
|
|
||||||
|
/* HPET General Configuration definitions */
|
||||||
|
#define HPET_CONFIG_ENABLE 0x0001ULL
|
||||||
|
#define HPET_CONFIG_LEGACY_REPLACEMENT 0x0002ULL
|
||||||
|
|
||||||
|
/* HPET Timer Configuration definitions */
|
||||||
|
#define HPET_TIMER_CONFIG_LEVEL_TRIGGERED 0x0002ULL
|
||||||
|
#define HPET_TIMER_CONFIG_ENABLED 0x0004ULL
|
||||||
|
#define HPET_TIMER_CONFIG_PERIODIC 0x0008ULL
|
||||||
|
#define HPET_TIMER_CONFIG_SUPPORTS_PERIODIC 0x0010ULL
|
||||||
|
#define HPET_TIMER_CONFIG_SUPPORTS_64BIT 0x0020ULL
|
||||||
|
#define HPET_TIMER_CONFIG_VALUE_ACCUMULATOR 0x0040ULL
|
||||||
|
#define HPET_TIMER_CONFIG_FORCE_32BIT 0x0100ULL
|
||||||
|
#define HPET_TIMER_CONFIG_FSB_ENABLED 0x4000ULL
|
||||||
|
#define HPET_TIMER_CONFIG_SUPPORTS_FSB 0x8000ULL
|
||||||
|
|
||||||
|
/* PIT ports definitions */
|
||||||
|
#define PIT_COMMAND_PORT 0x43
|
||||||
|
#define PIT_DATA_PORT0 0x40
|
||||||
|
#define PIT_DATA_PORT1 0x41
|
||||||
|
#define PIT_DATA_PORT2 0x42
|
||||||
|
|
||||||
|
/* PIT related definitions */
|
||||||
|
#define PIT_BASE_FREQUENCY 1193182
|
||||||
|
|
||||||
|
/* PIT Access Mode: Defines how the CPU reads or writes the counter value */
|
||||||
|
#define PIT_CMD_ACCESS_LATCH 0x00
|
||||||
|
#define PIT_CMD_ACCESS_LOWBYTE_ONLY 0x10
|
||||||
|
#define PIT_CMD_ACCESS_HIGHBYTE_ONLY 0x20
|
||||||
|
#define PIT_CMD_ACCESS_LOWBYTE_HIGHBYTE 0x30
|
||||||
|
|
||||||
|
/* PIT Channel Selection: Specifies the physical timer channel to configure */
|
||||||
|
#define PIT_CMD_CHANNEL0 0x00
|
||||||
|
#define PIT_CMD_CHANNEL1 0x40
|
||||||
|
#define PIT_CMD_CHANNEL2 0x80
|
||||||
|
|
||||||
|
/* PIT Operating Mode: Defines the hardware behavior and the generated waveform */
|
||||||
|
#define PIT_MODE0_INT_ON_TERMINAL_COUNT 0x00
|
||||||
|
#define PIT_MODE1_ONESHOT 0x02
|
||||||
|
#define PIT_MODE2_RATE_GENERATOR 0x04
|
||||||
|
#define PIT_MODE3_SQUARE_WAVE_GEN 0x06
|
||||||
|
#define PIT_MODE4_SOFTWARE_STROBE 0x08
|
||||||
|
#define PIT_MODE5_HARDWARE_STROBE 0x0A
|
||||||
|
|
||||||
|
/* CMOS controller access ports */
|
||||||
|
#define CMOS_SELECT_PORT 0x70
|
||||||
|
#define CMOS_DATA_PORT 0x71
|
||||||
|
|
||||||
|
/* CMOD Select port definitions */
|
||||||
|
#define CMOS_NMI_SELECT 0x80
|
||||||
|
#define CMOS_REGISTER_SECOND 0x00
|
||||||
|
#define CMOS_REGISTER_MINUTE 0x02
|
||||||
|
#define CMOS_REGISTER_HOUR 0x04
|
||||||
|
#define CMOS_REGISTER_WEEKDAY 0x06
|
||||||
|
#define CMOS_REGISTER_DAY 0x07
|
||||||
|
#define CMOS_REGISTER_MONTH 0x08
|
||||||
|
#define CMOS_REGISTER_YEAR 0x09
|
||||||
|
#define CMOS_REGISTER_A 0x0A
|
||||||
|
#define CMOS_REGISTER_B 0x0B
|
||||||
|
#define CMOS_REGISTER_C 0x0C
|
||||||
|
|
||||||
|
/* CMOS Register A definitions */
|
||||||
|
#define CMOS_REGISTER_A_RATE_MASK 0x0F
|
||||||
|
#define CMOS_REGISTER_A_UPDATE_IN_PROGRESS 0x80
|
||||||
|
|
||||||
|
/* CMOS Register B definitions */
|
||||||
|
#define CMOS_REGISTER_B_24_HOUR 0x02
|
||||||
|
#define CMOS_REGISTER_B_BINARY 0x04
|
||||||
|
#define CMOS_REGISTER_B_PERIODIC 0x40
|
||||||
|
#define CMOS_REGISTER_B_SET_CLOCK 0x80
|
||||||
|
|
||||||
|
/* CMOS Register C definitions */
|
||||||
|
#define CMOS_REGISTER_C_PERIODIC 0x40
|
||||||
|
#define CMOS_REGISTER_C_INTERRUPT 0x80
|
||||||
|
|
||||||
|
/* CMOS RTC 24-hour mode */
|
||||||
|
#define CMOS_RTC_POST_MERIDIEM 0x80
|
||||||
|
|
||||||
/* 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 +172,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 +240,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 +250,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
|
||||||
{
|
{
|
||||||
@@ -179,6 +307,17 @@ typedef enum _PIC_I8259_ICW4_SYSTEM_MODE
|
|||||||
New8086Mode
|
New8086Mode
|
||||||
} PIC_I8259_ICW4_SYSTEM_MODE, *PPIC_I8259_ICW4_SYSTEM_MODE;
|
} PIC_I8259_ICW4_SYSTEM_MODE, *PPIC_I8259_ICW4_SYSTEM_MODE;
|
||||||
|
|
||||||
|
/* Supported hardware timer backends */
|
||||||
|
typedef enum _TIMER_TYPE
|
||||||
|
{
|
||||||
|
TimerNone,
|
||||||
|
TimerAcpiPm,
|
||||||
|
TimerHpet,
|
||||||
|
TimerLapic,
|
||||||
|
TimerPit,
|
||||||
|
TimerTsc
|
||||||
|
} TIMER_TYPE, *PTIMER_TYPE;
|
||||||
|
|
||||||
/* APIC Base Register */
|
/* APIC Base Register */
|
||||||
typedef union _APIC_BASE_REGISTER
|
typedef union _APIC_BASE_REGISTER
|
||||||
{
|
{
|
||||||
@@ -252,6 +391,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 +490,39 @@ typedef union _PIC_I8259_ICW4
|
|||||||
UCHAR Bits;
|
UCHAR Bits;
|
||||||
} PIC_I8259_ICW4, *PPIC_I8259_ICW4;
|
} PIC_I8259_ICW4, *PPIC_I8259_ICW4;
|
||||||
|
|
||||||
|
/* HPET Registers structure definition */
|
||||||
|
typedef struct _HPET_REGISTERS
|
||||||
|
{
|
||||||
|
VOLATILE ULONGLONG GeneralCapabilities;
|
||||||
|
VOLATILE ULONGLONG Reserved0;
|
||||||
|
VOLATILE ULONGLONG GeneralConfiguration;
|
||||||
|
VOLATILE ULONGLONG Reserved1;
|
||||||
|
VOLATILE ULONGLONG GeneralInterruptStatus;
|
||||||
|
VOLATILE ULONGLONG Reserved2;
|
||||||
|
VOLATILE ULONGLONG Reserved3[2][12];
|
||||||
|
VOLATILE ULONGLONG MainCounterValue;
|
||||||
|
VOLATILE ULONGLONG Reserved4;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
VOLATILE ULONGLONG Configuration;
|
||||||
|
VOLATILE ULONGLONG Comparator;
|
||||||
|
VOLATILE ULONGLONG FsbInterruptRoute;
|
||||||
|
VOLATILE ULONGLONG Reserved;
|
||||||
|
} Timers[];
|
||||||
|
} HPET_REGISTERS, *PHPET_REGISTERS;
|
||||||
|
|
||||||
|
/* Hardware timer capabilities and CPU clock features */
|
||||||
|
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
|
||||||
@@ -67,6 +69,62 @@
|
|||||||
#define AMD64_INTERRUPT_GATE 0xE
|
#define AMD64_INTERRUPT_GATE 0xE
|
||||||
#define AMD64_TRAP_GATE 0xF
|
#define AMD64_TRAP_GATE 0xF
|
||||||
|
|
||||||
|
/* Kernel CPU Standard Features */
|
||||||
|
#define KCF_VME (1ULL << 0) /* Virtual 8086 Mode Enhancements */
|
||||||
|
#define KCF_LARGE_PAGE (1ULL << 1) /* Page Size Extensions */
|
||||||
|
#define KCF_RDTSC (1ULL << 2) /* Time Stamp Counter */
|
||||||
|
#define KCF_PAE (1ULL << 3) /* Physical Address Extension */
|
||||||
|
#define KCF_MCE (1ULL << 4) /* Machine Check Exception */
|
||||||
|
#define KCF_CMPXCHG8B (1ULL << 5) /* CMPXCHG8B Instruction */
|
||||||
|
#define KCF_APIC (1ULL << 6) /* APIC On-Chip */
|
||||||
|
#define KCF_FAST_SYSCALL (1ULL << 7) /* SYSENTER/SYSEXIT Instructions */
|
||||||
|
#define KCF_MTRR (1ULL << 8) /* Memory Type Range Registers */
|
||||||
|
#define KCF_GLOBAL_PAGE (1ULL << 9) /* Page Global Enable */
|
||||||
|
#define KCF_MCA (1ULL << 10) /* Machine Check Architecture */
|
||||||
|
#define KCF_CMOV (1ULL << 11) /* Conditional Move Instructions */
|
||||||
|
#define KCF_PAT (1ULL << 12) /* Page Attribute Table */
|
||||||
|
#define KCF_PSE36 (1ULL << 13) /* 36-bit Page Size Extension */
|
||||||
|
#define KCF_CLFLUSH (1ULL << 14) /* CLFLUSH Instruction */
|
||||||
|
#define KCF_FXSR (1ULL << 15) /* FXSAVE/FXRSTOR Instructions */
|
||||||
|
#define KCF_ACPI (1ULL << 16) /* Thermal Monitor and Software Controlled Clock */
|
||||||
|
#define KCF_MMX (1ULL << 17) /* MMX Technology */
|
||||||
|
#define KCF_SSE (1ULL << 18) /* Streaming SIMD Extensions */
|
||||||
|
#define KCF_SSE2 (1ULL << 19) /* Streaming SIMD Extensions 2 */
|
||||||
|
#define KCF_SMT (1ULL << 20) /* Hyper-Threading Technology */
|
||||||
|
#define KCF_SSE3 (1ULL << 21) /* Streaming SIMD Extensions 3 */
|
||||||
|
#define KCF_VMX (1ULL << 22) /* Intel Virtual Machine Extensions */
|
||||||
|
#define KCF_SSSE3 (1ULL << 23) /* Supplemental SSE3 Instructions */
|
||||||
|
#define KCF_SSE41 (1ULL << 24) /* SSE4.1 Instructions */
|
||||||
|
#define KCF_SSE42 (1ULL << 25) /* SSE4.2 Instructions */
|
||||||
|
#define KCF_X2APIC (1ULL << 26) /* x2APIC Support */
|
||||||
|
#define KCF_POPCNT (1ULL << 27) /* POPCNT Instruction */
|
||||||
|
#define KCF_TSC_DEADLINE (1ULL << 28) /* TSC Deadline Timer */
|
||||||
|
#define KCF_AES (1ULL << 29) /* AES-NI Instruction Set */
|
||||||
|
#define KCF_XSAVE (1ULL << 30) /* XSAVE/XRSTOR Instructions */
|
||||||
|
#define KCF_AVX (1ULL << 31) /* Advanced Vector Extensions */
|
||||||
|
#define KCF_RDRAND (1ULL << 32) /* RDRAND Instruction */
|
||||||
|
#define KCF_FSGSBASE (1ULL << 33) /* RDFSBASE/WRFSBASE Instructions */
|
||||||
|
#define KCF_AVX2 (1ULL << 34) /* AVX2 Instructions */
|
||||||
|
#define KCF_SMEP (1ULL << 35) /* Supervisor Mode Execution Prevention */
|
||||||
|
#define KCF_RDSEED (1ULL << 36) /* RDSEED Instruction */
|
||||||
|
#define KCF_SMAP (1ULL << 37) /* Supervisor Mode Access Prevention */
|
||||||
|
#define KCF_SHA (1ULL << 38) /* SHA Extensions */
|
||||||
|
#define KCF_LA57 (1ULL << 39) /* 57-bit Linear Addresses */
|
||||||
|
#define KCF_ARAT (1ULL << 40) /* Always Running APIC Timer */
|
||||||
|
|
||||||
|
/* Kernel CPU Extended Features */
|
||||||
|
#define KCF_SVM (1ULL << 0) /* AMD Secure Virtual Machine */
|
||||||
|
#define KCF_SSE4A (1ULL << 1) /* SSE4A Instructions */
|
||||||
|
#define KCF_FMA4 (1ULL << 2) /* FMA4 Instructions */
|
||||||
|
#define KCF_TOPOEXT (1ULL << 3) /* AMD Topology Extensions */
|
||||||
|
#define KCF_SYSCALL (1ULL << 4) /* SYSCALL/SYSRET Instructions */
|
||||||
|
#define KCF_NX_BIT (1ULL << 5) /* No-Execute Page Protection */
|
||||||
|
#define KCF_RDTSCP (1ULL << 6) /* RDTSCP Instruction */
|
||||||
|
#define KCF_64BIT (1ULL << 7) /* Long Mode Support */
|
||||||
|
#define KCF_3DNOW_EXT (1ULL << 8) /* 3DNow! Extensions */
|
||||||
|
#define KCF_3DNOW (1ULL << 9) /* 3DNow! Instructions */
|
||||||
|
#define KCF_INVARIANT_TSC (1ULL << 10) /* Invariant Time Stamp Counter */
|
||||||
|
|
||||||
/* Context control flags */
|
/* Context control flags */
|
||||||
#define CONTEXT_ARCHITECTURE 0x00100000
|
#define CONTEXT_ARCHITECTURE 0x00100000
|
||||||
#define CONTEXT_CONTROL (CONTEXT_ARCHITECTURE | 0x01)
|
#define CONTEXT_CONTROL (CONTEXT_ARCHITECTURE | 0x01)
|
||||||
@@ -108,18 +166,16 @@
|
|||||||
/* 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
|
||||||
|
|
||||||
/* Processor structures size */
|
/* Processor structures size */
|
||||||
#define KPROCESSOR_STRUCTURES_SIZE ((2 * KERNEL_STACK_SIZE) + (GDT_ENTRIES * sizeof(KGDTENTRY)) + sizeof(KTSS) + \
|
#define KPROCESSOR_STRUCTURES_SIZE ((KERNEL_STACKS * KERNEL_STACK_SIZE) + (GDT_ENTRIES * sizeof(KGDTENTRY)) + \
|
||||||
sizeof(KPROCESSOR_BLOCK) + MM_PAGE_SIZE)
|
sizeof(KTSS) + sizeof(KPROCESSOR_BLOCK) + MM_PAGE_SIZE)
|
||||||
|
|
||||||
/* Kernel frames */
|
/* Kernel frames */
|
||||||
#define KEXCEPTION_FRAME_SIZE sizeof(KEXCEPTION_FRAME)
|
#define KEXCEPTION_FRAME_SIZE sizeof(KEXCEPTION_FRAME)
|
||||||
@@ -138,6 +194,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 +332,18 @@ typedef struct _KIDTENTRY
|
|||||||
{
|
{
|
||||||
USHORT OffsetLow;
|
USHORT OffsetLow;
|
||||||
USHORT Selector;
|
USHORT Selector;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
USHORT IstIndex:3;
|
USHORT IstIndex:3;
|
||||||
USHORT Reserved0:5;
|
USHORT Reserved0:5;
|
||||||
USHORT Type:5;
|
USHORT Type:5;
|
||||||
USHORT Dpl:2;
|
USHORT Dpl:2;
|
||||||
USHORT Present:1;
|
USHORT Present:1;
|
||||||
|
};
|
||||||
|
USHORT Access;
|
||||||
|
};
|
||||||
USHORT OffsetMiddle;
|
USHORT OffsetMiddle;
|
||||||
ULONG OffsetHigh;
|
ULONG OffsetHigh;
|
||||||
ULONG Reserved1;
|
ULONG Reserved1;
|
||||||
@@ -459,11 +526,22 @@ typedef struct _KSPECIAL_REGISTERS
|
|||||||
ULONG64 MsrSyscallMask;
|
ULONG64 MsrSyscallMask;
|
||||||
} KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
|
} KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
|
||||||
|
|
||||||
|
/* Processor start block structure definition */
|
||||||
|
typedef struct _PROCESSOR_START_BLOCK
|
||||||
|
{
|
||||||
|
ULONG_PTR Cr3;
|
||||||
|
ULONG_PTR Cr4;
|
||||||
|
PVOID EntryPoint;
|
||||||
|
PVOID ProcessorStructures;
|
||||||
|
PVOID Stack;
|
||||||
|
BOOLEAN Started;
|
||||||
|
} PROCESSOR_START_BLOCK, *PPROCESSOR_START_BLOCK;
|
||||||
|
|
||||||
/* Processor state frame structure definition */
|
/* Processor state frame structure definition */
|
||||||
typedef struct _KPROCESSOR_STATE
|
typedef struct _KPROCESSOR_STATE
|
||||||
{
|
{
|
||||||
KSPECIAL_REGISTERS SpecialRegisters;
|
|
||||||
CONTEXT ContextFrame;
|
CONTEXT ContextFrame;
|
||||||
|
KSPECIAL_REGISTERS SpecialRegisters;
|
||||||
} KPROCESSOR_STATE, *PKPROCESSOR_STATE;
|
} KPROCESSOR_STATE, *PKPROCESSOR_STATE;
|
||||||
|
|
||||||
/* Processor Control Block (PRCB) structure definition */
|
/* Processor Control Block (PRCB) structure definition */
|
||||||
@@ -486,6 +564,7 @@ typedef struct _KPROCESSOR_CONTROL_BLOCK
|
|||||||
ULONG_PTR MultiThreadProcessorSet;
|
ULONG_PTR MultiThreadProcessorSet;
|
||||||
SINGLE_LIST_ENTRY DeferredReadyListHead;
|
SINGLE_LIST_ENTRY DeferredReadyListHead;
|
||||||
PROCESSOR_POWER_STATE PowerState;
|
PROCESSOR_POWER_STATE PowerState;
|
||||||
|
ULONG ProfilingCountdown;
|
||||||
} KPROCESSOR_CONTROL_BLOCK, *PKPROCESSOR_CONTROL_BLOCK;
|
} KPROCESSOR_CONTROL_BLOCK, *PKPROCESSOR_CONTROL_BLOCK;
|
||||||
|
|
||||||
/* Processor Block structure definition */
|
/* Processor Block structure definition */
|
||||||
@@ -512,6 +591,9 @@ typedef struct _KPROCESSOR_BLOCK
|
|||||||
KAFFINITY SetMember;
|
KAFFINITY SetMember;
|
||||||
ULONG StallScaleFactor;
|
ULONG StallScaleFactor;
|
||||||
UCHAR CpuNumber;
|
UCHAR CpuNumber;
|
||||||
|
ULONG HardwareId;
|
||||||
|
VOLATILE BOOLEAN Started;
|
||||||
|
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 +602,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
|
||||||
|
|
||||||
@@ -60,12 +101,31 @@
|
|||||||
/* HAL memory pool virtual address start */
|
/* HAL memory pool virtual address start */
|
||||||
#define MM_HARDWARE_VA_START 0xFFFFFFFFFFC00000ULL
|
#define MM_HARDWARE_VA_START 0xFFFFFFFFFFC00000ULL
|
||||||
|
|
||||||
|
/* Kernel shared data address */
|
||||||
|
#define MM_KERNEL_SHARED_DATA_ADDRESS 0xFFFFFFFFFFDF0000ULL
|
||||||
|
|
||||||
/* 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 +312,7 @@ typedef struct _MMPFN
|
|||||||
USHORT ReferenceCount;
|
USHORT ReferenceCount;
|
||||||
} e2;
|
} e2;
|
||||||
} u3;
|
} u3;
|
||||||
|
ULONG UsedPageTableEntries;
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
MMPTE OriginalPte;
|
MMPTE OriginalPte;
|
||||||
@@ -262,15 +323,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;
|
||||||
@@ -30,6 +37,7 @@ typedef enum _PIC_I8259_ICW1_OPERATING_MODE PIC_I8259_ICW1_OPERATING_MODE, *PPIC
|
|||||||
typedef enum _PIC_I8259_ICW4_BUFFERED_MODE PIC_I8259_ICW4_BUFFERED_MODE, *PPIC_I8259_ICW4_BUFFERED_MODE;
|
typedef enum _PIC_I8259_ICW4_BUFFERED_MODE PIC_I8259_ICW4_BUFFERED_MODE, *PPIC_I8259_ICW4_BUFFERED_MODE;
|
||||||
typedef enum _PIC_I8259_ICW4_EOI_MODE PIC_I8259_ICW4_EOI_MODE, *PPIC_I8259_ICW4_EOI_MODE;
|
typedef enum _PIC_I8259_ICW4_EOI_MODE PIC_I8259_ICW4_EOI_MODE, *PPIC_I8259_ICW4_EOI_MODE;
|
||||||
typedef enum _PIC_I8259_ICW4_SYSTEM_MODE PIC_I8259_ICW4_SYSTEM_MODE, *PPIC_I8259_ICW4_SYSTEM_MODE;
|
typedef enum _PIC_I8259_ICW4_SYSTEM_MODE PIC_I8259_ICW4_SYSTEM_MODE, *PPIC_I8259_ICW4_SYSTEM_MODE;
|
||||||
|
typedef enum _TIMER_TYPE TIMER_TYPE, *PTIMER_TYPE;
|
||||||
typedef enum _TRAMPOLINE_TYPE TRAMPOLINE_TYPE, *PTRAMPOLINE_TYPE;
|
typedef enum _TRAMPOLINE_TYPE TRAMPOLINE_TYPE, *PTRAMPOLINE_TYPE;
|
||||||
|
|
||||||
/* Architecture-specific structures forward references */
|
/* Architecture-specific structures forward references */
|
||||||
@@ -39,6 +47,8 @@ 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 _HPET_REGISTERS HPET_REGISTERS, *PHPET_REGISTERS;
|
||||||
|
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 +71,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 +91,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 */
|
||||||
|
|||||||
@@ -29,6 +29,10 @@
|
|||||||
#define XTBL_DEBUGPORT_SCREEN 1
|
#define XTBL_DEBUGPORT_SCREEN 1
|
||||||
#define XTBL_DEBUGPORT_SERIAL 2
|
#define XTBL_DEBUGPORT_SERIAL 2
|
||||||
|
|
||||||
|
/* XTLDR Shell definitions */
|
||||||
|
#define XTBL_SH_MAX_LINE_LENGTH 256
|
||||||
|
#define XTBL_SH_HISTORY_ENTRIES 20
|
||||||
|
|
||||||
/* TUI dialog box attributes */
|
/* TUI dialog box attributes */
|
||||||
#define XTBL_TUI_DIALOG_GENERIC_BOX 1
|
#define XTBL_TUI_DIALOG_GENERIC_BOX 1
|
||||||
#define XTBL_TUI_DIALOG_ERROR_BOX 2
|
#define XTBL_TUI_DIALOG_ERROR_BOX 2
|
||||||
@@ -41,6 +45,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 +59,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);
|
||||||
@@ -68,7 +77,7 @@ typedef VOID (XTCDECL *PBL_CONSOLE_DISABLE_CURSOR)();
|
|||||||
typedef VOID (XTCDECL *PBL_CONSOLE_ENABLE_CURSOR)();
|
typedef VOID (XTCDECL *PBL_CONSOLE_ENABLE_CURSOR)();
|
||||||
typedef VOID (XTCDECL *PBL_CONSOLE_PRINT)(IN PCWSTR Format, IN ...);
|
typedef VOID (XTCDECL *PBL_CONSOLE_PRINT)(IN PCWSTR Format, IN ...);
|
||||||
typedef VOID (XTCDECL *PBL_CONSOLE_QUERY_MODE)(OUT PUINT_PTR ResX, OUT PUINT_PTR ResY);
|
typedef VOID (XTCDECL *PBL_CONSOLE_QUERY_MODE)(OUT PUINT_PTR ResX, OUT PUINT_PTR ResY);
|
||||||
typedef VOID (XTCDECL *PBL_CONSOLE_READ_KEY_STROKE)(OUT PEFI_INPUT_KEY Key);
|
typedef EFI_STATUS (XTCDECL *PBL_CONSOLE_READ_KEY_STROKE)(OUT PEFI_INPUT_KEY Key);
|
||||||
typedef VOID (XTCDECL *PBL_CONSOLE_RESET_INPUT_BUFFER)();
|
typedef VOID (XTCDECL *PBL_CONSOLE_RESET_INPUT_BUFFER)();
|
||||||
typedef VOID (XTCDECL *PBL_CONSOLE_SET_ATTRIBUTES)(IN ULONGLONG Attributes);
|
typedef VOID (XTCDECL *PBL_CONSOLE_SET_ATTRIBUTES)(IN ULONGLONG Attributes);
|
||||||
typedef VOID (XTCDECL *PBL_CONSOLE_SET_CURSOR_POSITION)(IN ULONGLONG PosX, IN ULONGLONG PosY);
|
typedef VOID (XTCDECL *PBL_CONSOLE_SET_CURSOR_POSITION)(IN ULONGLONG PosX, IN ULONGLONG PosY);
|
||||||
@@ -100,9 +109,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);
|
||||||
@@ -138,6 +147,8 @@ typedef XTSTATUS (XTAPI *PBL_WIDESTRING_FORMAT)(IN PRTL_PRINT_CONTEXT Context, I
|
|||||||
typedef SIZE_T (XTAPI *PBL_WIDESTRING_LENGTH)(IN PCWSTR String, IN SIZE_T MaxLength);
|
typedef SIZE_T (XTAPI *PBL_WIDESTRING_LENGTH)(IN PCWSTR String, IN SIZE_T MaxLength);
|
||||||
typedef PWCHAR (XTAPI *PBL_WIDESTRING_TOKENIZE)(IN PWCHAR String, IN PCWSTR Delimiter, IN OUT PWCHAR *SavePtr);
|
typedef PWCHAR (XTAPI *PBL_WIDESTRING_TOKENIZE)(IN PWCHAR String, IN PCWSTR Delimiter, IN OUT PWCHAR *SavePtr);
|
||||||
typedef EFI_STATUS (XTCDECL *PBL_WAIT_FOR_EFI_EVENT)(IN UINT_PTR NumberOfEvents, IN PEFI_EVENT Event, OUT PUINT_PTR Index);
|
typedef EFI_STATUS (XTCDECL *PBL_WAIT_FOR_EFI_EVENT)(IN UINT_PTR NumberOfEvents, IN PEFI_EVENT Event, OUT PUINT_PTR Index);
|
||||||
|
typedef VOID (XTCDECL *PBL_SHELL_COMMAND)(IN ULONG Argc, IN PWCHAR *Argv);
|
||||||
|
typedef EFI_STATUS (XTCDECL *PBL_REGISTER_SHELL_COMMAND)(IN PCWSTR Command, IN PCWSTR Description, IN PBL_SHELL_COMMAND Handler);
|
||||||
typedef VOID (XTCDECL *PBL_XT_BOOT_MENU)();
|
typedef VOID (XTCDECL *PBL_XT_BOOT_MENU)();
|
||||||
typedef VOID (XTAPI *PBL_ZERO_MEMORY)(OUT PVOID Destination, IN SIZE_T Length);
|
typedef VOID (XTAPI *PBL_ZERO_MEMORY)(OUT PVOID Destination, IN SIZE_T Length);
|
||||||
|
|
||||||
@@ -228,12 +239,21 @@ typedef struct _XTBL_KNOWN_BOOT_PROTOCOL
|
|||||||
EFI_GUID Guid;
|
EFI_GUID Guid;
|
||||||
} XTBL_KNOWN_BOOT_PROTOCOL, *PXTBL_KNOWN_BOOT_PROTOCOL;
|
} XTBL_KNOWN_BOOT_PROTOCOL, *PXTBL_KNOWN_BOOT_PROTOCOL;
|
||||||
|
|
||||||
|
/* XTLDR Shell command entry */
|
||||||
|
typedef struct _XTBL_SHELL_COMMAND
|
||||||
|
{
|
||||||
|
LIST_ENTRY Flink;
|
||||||
|
PWCHAR Command;
|
||||||
|
PWCHAR Description;
|
||||||
|
PBL_SHELL_COMMAND Handler;
|
||||||
|
} XTBL_SHELL_COMMAND, *PXTBL_SHELL_COMMAND;
|
||||||
|
|
||||||
/* Boot Loader memory mapping information */
|
/* Boot Loader memory mapping information */
|
||||||
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 +469,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;
|
||||||
@@ -476,6 +497,10 @@ typedef struct _XTBL_LOADER_PROTOCOL
|
|||||||
PBL_OPEN_PROTOCOL_HANDLE OpenHandle;
|
PBL_OPEN_PROTOCOL_HANDLE OpenHandle;
|
||||||
} Protocol;
|
} Protocol;
|
||||||
struct
|
struct
|
||||||
|
{
|
||||||
|
PBL_REGISTER_SHELL_COMMAND RegisterCommand;
|
||||||
|
} Shell;
|
||||||
|
struct
|
||||||
{
|
{
|
||||||
PBL_STRING_COMPARE Compare;
|
PBL_STRING_COMPARE Compare;
|
||||||
PBL_STRING_LENGTH Length;
|
PBL_STRING_LENGTH Length;
|
||||||
@@ -518,4 +543,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,7 +14,15 @@
|
|||||||
#include <xttypes.h>
|
#include <xttypes.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* Hardware layer routines forward references */
|
/* Hardware layer routines forward references */
|
||||||
|
XTCLINK
|
||||||
|
XTAPI
|
||||||
|
LARGE_INTEGER
|
||||||
|
HlQueryPerformanceCounter(OUT PLARGE_INTEGER PerformanceFrequency);
|
||||||
|
|
||||||
XTCLINK
|
XTCLINK
|
||||||
XTAPI
|
XTAPI
|
||||||
UCHAR
|
UCHAR
|
||||||
@@ -30,6 +38,11 @@ XTAPI
|
|||||||
ULONG
|
ULONG
|
||||||
HlReadRegister32(IN PVOID Register);
|
HlReadRegister32(IN PVOID Register);
|
||||||
|
|
||||||
|
XTCLINK
|
||||||
|
XTAPI
|
||||||
|
ULONG
|
||||||
|
HlSetClockRate(IN ULONG Rate);
|
||||||
|
|
||||||
XTCLINK
|
XTCLINK
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
@@ -48,4 +61,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 */
|
||||||
|
|||||||
@@ -64,8 +64,8 @@
|
|||||||
#define ACPI_FADT_32BIT_TIMER (1<<8)
|
#define ACPI_FADT_32BIT_TIMER (1<<8)
|
||||||
|
|
||||||
/* ACPI Timer bit masks */
|
/* ACPI Timer bit masks */
|
||||||
#define ACPI_FADT_TIMER_32BIT 0x80000000
|
#define ACPI_FADT_TIMER_32BIT 0xFFFFFFFF
|
||||||
#define ACPI_FADT_TIMER_24BIT 0x00800000
|
#define ACPI_FADT_TIMER_24BIT 0x00FFFFFF
|
||||||
|
|
||||||
/* ACPI MADT subtable type definitions */
|
/* ACPI MADT subtable type definitions */
|
||||||
#define ACPI_MADT_TYPE_LOCAL_APIC 0
|
#define ACPI_MADT_TYPE_LOCAL_APIC 0
|
||||||
@@ -101,6 +101,15 @@
|
|||||||
#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 Timer frequency */
|
||||||
|
#define ACPI_PM_TIMER_FREQUENCY 3579545
|
||||||
|
|
||||||
|
/* 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 +188,33 @@
|
|||||||
#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 */
|
||||||
|
|
||||||
|
/* Standard system clock rates (in 100-nanosecond units)*/
|
||||||
|
#define HL_CLOCK_RATE_1000HZ 10000 /* 1 ms (1000 Hz) - Best Performance */
|
||||||
|
#define HL_CLOCK_RATE_500HZ 20000 /* 2 ms (500 Hz) - High Responsiveness */
|
||||||
|
#define HL_CLOCK_RATE_300HZ 33333 /* 3.33ms (300 Hz) - Multimedia Sync */
|
||||||
|
#define HL_CLOCK_RATE_250HZ 40000 /* 4 ms (250 Hz) - Optimal Balance */
|
||||||
|
#define HL_CLOCK_RATE_100HZ 100000 /* 10 ms (100 Hz) - Power Saving */
|
||||||
|
#define HL_CLOCK_RATE_50HZ 200000 /* 20 ms (50 Hz) - Deep Power Saving */
|
||||||
|
|
||||||
|
/* Minimum and maximum system clock rate definitions */
|
||||||
|
#define HL_MINIMUM_CLOCK_RATE HL_CLOCK_RATE_1000HZ
|
||||||
|
#define HL_MAXIMUM_CLOCK_RATE HL_CLOCK_RATE_50HZ
|
||||||
|
|
||||||
|
/* Minimum and maximum profile intervals */
|
||||||
|
#define MIN_PROFILE_INTERVAL 10000
|
||||||
|
#define MAX_PROFILE_INTERVAL 10000000
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
|
/* Hardware Layer routine callbacks */
|
||||||
|
typedef XTSTATUS (XTAPI *PHALP_INITIALIZE_CLOCK)(VOID);
|
||||||
|
typedef ULONGLONG (XTAPI *PHALP_QUERY_PERF_COUNTER)(VOID);
|
||||||
|
typedef ULONG (XTAPI *PHALP_QUERY_TIME_DELTA)(VOID);
|
||||||
|
typedef ULONG (XTAPI *PHALP_SET_CLOCK_RATE)(IN ULONG Increment);
|
||||||
|
typedef VOID (XTAPI *PHALP_STALL_EXECUTION)(IN ULONG MicroSeconds);
|
||||||
|
|
||||||
/* Generic Address structure */
|
/* Generic Address structure */
|
||||||
typedef struct _GENERIC_ADDRESS
|
typedef struct _GENERIC_ADDRESS
|
||||||
{
|
{
|
||||||
@@ -214,7 +250,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 +341,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 +361,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 +517,15 @@ typedef struct _SMBIOS3_TABLE_HEADER
|
|||||||
ULONGLONG TableAddress;
|
ULONGLONG TableAddress;
|
||||||
} SMBIOS3_TABLE_HEADER, *PSMBIOS3_TABLE_HEADER;
|
} SMBIOS3_TABLE_HEADER, *PSMBIOS3_TABLE_HEADER;
|
||||||
|
|
||||||
|
/* Timer dispatch table */
|
||||||
|
typedef struct _TIMER_ROUTINES
|
||||||
|
{
|
||||||
|
PHALP_INITIALIZE_CLOCK InitializeClock;
|
||||||
|
PHALP_QUERY_PERF_COUNTER QueryPerformanceCounter;
|
||||||
|
PHALP_QUERY_TIME_DELTA QueryTimeDelta;
|
||||||
|
PHALP_SET_CLOCK_RATE SetClockRate;
|
||||||
|
PHALP_STALL_EXECUTION StallExecution;
|
||||||
|
} TIMER_ROUTINES, *PTIMER_ROUTINES;
|
||||||
|
|
||||||
|
#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,28 +375,33 @@ 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
|
||||||
{
|
{
|
||||||
|
ULONGLONG ExtendedFeatureBits;
|
||||||
USHORT Family;
|
USHORT Family;
|
||||||
|
ULONGLONG FeatureBits;
|
||||||
USHORT Model;
|
USHORT Model;
|
||||||
USHORT Stepping;
|
USHORT Stepping;
|
||||||
CPU_VENDOR Vendor;
|
CPU_VENDOR Vendor;
|
||||||
UCHAR VendorName[13];
|
UCHAR VendorName[13];
|
||||||
UINT32 StandardFeaturesEcx;
|
|
||||||
UINT32 StandardFeaturesEdx;
|
|
||||||
UINT32 ExtendedFeaturesEcx;
|
|
||||||
UINT32 ExtendedFeaturesEdx;
|
|
||||||
} CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
|
} CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
|
||||||
|
|
||||||
/* CPUID registers */
|
/* CPUID registers */
|
||||||
@@ -394,4 +433,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 */
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#ifndef __XTDK_I686_HLTYPES_H
|
#ifndef __XTDK_I686_HLTYPES_H
|
||||||
#define __XTDK_I686_HLTYPES_H
|
#define __XTDK_I686_HLTYPES_H
|
||||||
|
|
||||||
|
#include <xtbase.h>
|
||||||
#include <xtdefs.h>
|
#include <xtdefs.h>
|
||||||
#include <xtstruct.h>
|
#include <xtstruct.h>
|
||||||
#include <xttypes.h>
|
#include <xttypes.h>
|
||||||
@@ -36,6 +37,7 @@
|
|||||||
#define APIC_VECTOR_GENERIC 0xC1
|
#define APIC_VECTOR_GENERIC 0xC1
|
||||||
#define APIC_VECTOR_SYNC 0xC1
|
#define APIC_VECTOR_SYNC 0xC1
|
||||||
#define APIC_VECTOR_CLOCK 0xD1
|
#define APIC_VECTOR_CLOCK 0xD1
|
||||||
|
#define APIC_VECTOR_CLOCK_IPI 0xD2
|
||||||
#define APIC_VECTOR_IPI 0xE1
|
#define APIC_VECTOR_IPI 0xE1
|
||||||
#define APIC_VECTOR_ERROR 0xE3
|
#define APIC_VECTOR_ERROR 0xE3
|
||||||
#define APIC_VECTOR_POWERFAIL 0xEF
|
#define APIC_VECTOR_POWERFAIL 0xEF
|
||||||
@@ -58,6 +60,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 64
|
||||||
|
#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
|
||||||
@@ -69,6 +92,87 @@
|
|||||||
/* PIC vector definitions */
|
/* PIC vector definitions */
|
||||||
#define PIC1_VECTOR_SPURIOUS 0x37
|
#define PIC1_VECTOR_SPURIOUS 0x37
|
||||||
|
|
||||||
|
/* HPET General Capabilities definitions */
|
||||||
|
#define HPET_CAPABILITY_64BIT 0x2000ULL
|
||||||
|
#define HPET_CAPABILITY_LEGACY_REPLACEMENT 0x8000ULL
|
||||||
|
|
||||||
|
/* HPET General Configuration definitions */
|
||||||
|
#define HPET_CONFIG_ENABLE 0x0001ULL
|
||||||
|
#define HPET_CONFIG_LEGACY_REPLACEMENT 0x0002ULL
|
||||||
|
|
||||||
|
/* HPET Timer Configuration definitions */
|
||||||
|
#define HPET_TIMER_CONFIG_LEVEL_TRIGGERED 0x0002ULL
|
||||||
|
#define HPET_TIMER_CONFIG_ENABLED 0x0004ULL
|
||||||
|
#define HPET_TIMER_CONFIG_PERIODIC 0x0008ULL
|
||||||
|
#define HPET_TIMER_CONFIG_SUPPORTS_PERIODIC 0x0010ULL
|
||||||
|
#define HPET_TIMER_CONFIG_SUPPORTS_64BIT 0x0020ULL
|
||||||
|
#define HPET_TIMER_CONFIG_VALUE_ACCUMULATOR 0x0040ULL
|
||||||
|
#define HPET_TIMER_CONFIG_FORCE_32BIT 0x0100ULL
|
||||||
|
#define HPET_TIMER_CONFIG_FSB_ENABLED 0x4000ULL
|
||||||
|
#define HPET_TIMER_CONFIG_SUPPORTS_FSB 0x8000ULL
|
||||||
|
|
||||||
|
/* PIT ports definitions */
|
||||||
|
#define PIT_COMMAND_PORT 0x43
|
||||||
|
#define PIT_DATA_PORT0 0x40
|
||||||
|
#define PIT_DATA_PORT1 0x41
|
||||||
|
#define PIT_DATA_PORT2 0x42
|
||||||
|
|
||||||
|
/* PIT related definitions */
|
||||||
|
#define PIT_BASE_FREQUENCY 1193182
|
||||||
|
|
||||||
|
/* PIT Access Mode: Defines how the CPU reads or writes the counter value */
|
||||||
|
#define PIT_CMD_ACCESS_LATCH 0x00
|
||||||
|
#define PIT_CMD_ACCESS_LOWBYTE_ONLY 0x10
|
||||||
|
#define PIT_CMD_ACCESS_HIGHBYTE_ONLY 0x20
|
||||||
|
#define PIT_CMD_ACCESS_LOWBYTE_HIGHBYTE 0x30
|
||||||
|
|
||||||
|
/* PIT Channel Selection: Specifies the physical timer channel to configure */
|
||||||
|
#define PIT_CMD_CHANNEL0 0x00
|
||||||
|
#define PIT_CMD_CHANNEL1 0x40
|
||||||
|
#define PIT_CMD_CHANNEL2 0x80
|
||||||
|
|
||||||
|
/* PIT Operating Mode: Defines the hardware behavior and the generated waveform */
|
||||||
|
#define PIT_MODE0_INT_ON_TERMINAL_COUNT 0x00
|
||||||
|
#define PIT_MODE1_ONESHOT 0x02
|
||||||
|
#define PIT_MODE2_RATE_GENERATOR 0x04
|
||||||
|
#define PIT_MODE3_SQUARE_WAVE_GEN 0x06
|
||||||
|
#define PIT_MODE4_SOFTWARE_STROBE 0x08
|
||||||
|
#define PIT_MODE5_HARDWARE_STROBE 0x0A
|
||||||
|
|
||||||
|
/* CMOS controller access ports */
|
||||||
|
#define CMOS_SELECT_PORT 0x70
|
||||||
|
#define CMOS_DATA_PORT 0x71
|
||||||
|
|
||||||
|
/* CMOD Select port definitions */
|
||||||
|
#define CMOS_NMI_SELECT 0x80
|
||||||
|
#define CMOS_REGISTER_SECOND 0x00
|
||||||
|
#define CMOS_REGISTER_MINUTE 0x02
|
||||||
|
#define CMOS_REGISTER_HOUR 0x04
|
||||||
|
#define CMOS_REGISTER_WEEKDAY 0x06
|
||||||
|
#define CMOS_REGISTER_DAY 0x07
|
||||||
|
#define CMOS_REGISTER_MONTH 0x08
|
||||||
|
#define CMOS_REGISTER_YEAR 0x09
|
||||||
|
#define CMOS_REGISTER_A 0x0A
|
||||||
|
#define CMOS_REGISTER_B 0x0B
|
||||||
|
#define CMOS_REGISTER_C 0x0C
|
||||||
|
|
||||||
|
/* CMOS Register A definitions */
|
||||||
|
#define CMOS_REGISTER_A_RATE_MASK 0x0F
|
||||||
|
#define CMOS_REGISTER_A_UPDATE_IN_PROGRESS 0x80
|
||||||
|
|
||||||
|
/* CMOS Register B definitions */
|
||||||
|
#define CMOS_REGISTER_B_24_HOUR 0x02
|
||||||
|
#define CMOS_REGISTER_B_BINARY 0x04
|
||||||
|
#define CMOS_REGISTER_B_PERIODIC 0x40
|
||||||
|
#define CMOS_REGISTER_B_SET_CLOCK 0x80
|
||||||
|
|
||||||
|
/* CMOS Register C definitions */
|
||||||
|
#define CMOS_REGISTER_C_PERIODIC 0x40
|
||||||
|
#define CMOS_REGISTER_C_INTERRUPT 0x80
|
||||||
|
|
||||||
|
/* CMOS RTC 24-hour mode */
|
||||||
|
#define CMOS_RTC_POST_MERIDIEM 0x80
|
||||||
|
|
||||||
/* 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
|
||||||
@@ -76,6 +180,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
|
||||||
{
|
{
|
||||||
@@ -133,6 +248,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 */
|
||||||
@@ -142,6 +258,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
|
||||||
{
|
{
|
||||||
@@ -186,6 +315,17 @@ typedef enum _PIC_I8259_ICW4_SYSTEM_MODE
|
|||||||
New8086Mode
|
New8086Mode
|
||||||
} PIC_I8259_ICW4_SYSTEM_MODE, *PPIC_I8259_ICW4_SYSTEM_MODE;
|
} PIC_I8259_ICW4_SYSTEM_MODE, *PPIC_I8259_ICW4_SYSTEM_MODE;
|
||||||
|
|
||||||
|
/* Supported hardware timer backends */
|
||||||
|
typedef enum _TIMER_TYPE
|
||||||
|
{
|
||||||
|
TimerNone,
|
||||||
|
TimerAcpiPm,
|
||||||
|
TimerHpet,
|
||||||
|
TimerLapic,
|
||||||
|
TimerPit,
|
||||||
|
TimerTsc
|
||||||
|
} TIMER_TYPE, *PTIMER_TYPE;
|
||||||
|
|
||||||
/* APIC Base Register */
|
/* APIC Base Register */
|
||||||
typedef union _APIC_BASE_REGISTER
|
typedef union _APIC_BASE_REGISTER
|
||||||
{
|
{
|
||||||
@@ -259,6 +399,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
|
||||||
{
|
{
|
||||||
@@ -324,4 +498,39 @@ typedef union _PIC_I8259_ICW4
|
|||||||
UCHAR Bits;
|
UCHAR Bits;
|
||||||
} PIC_I8259_ICW4, *PPIC_I8259_ICW4;
|
} PIC_I8259_ICW4, *PPIC_I8259_ICW4;
|
||||||
|
|
||||||
|
/* HPET Registers structure definition */
|
||||||
|
typedef struct _HPET_REGISTERS
|
||||||
|
{
|
||||||
|
VOLATILE ULONGLONG GeneralCapabilities;
|
||||||
|
VOLATILE ULONGLONG Reserved0;
|
||||||
|
VOLATILE ULONGLONG GeneralConfiguration;
|
||||||
|
VOLATILE ULONGLONG Reserved1;
|
||||||
|
VOLATILE ULONGLONG GeneralInterruptStatus;
|
||||||
|
VOLATILE ULONGLONG Reserved2;
|
||||||
|
VOLATILE ULONGLONG Reserved3[2][12];
|
||||||
|
VOLATILE ULONGLONG MainCounterValue;
|
||||||
|
VOLATILE ULONGLONG Reserved4;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
VOLATILE ULONGLONG Configuration;
|
||||||
|
VOLATILE ULONGLONG Comparator;
|
||||||
|
VOLATILE ULONGLONG FsbInterruptRoute;
|
||||||
|
VOLATILE ULONGLONG Reserved;
|
||||||
|
} Timers[];
|
||||||
|
} HPET_REGISTERS, *PHPET_REGISTERS;
|
||||||
|
|
||||||
|
/* Hardware timer capabilities and CPU clock features */
|
||||||
|
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_I686_HLTYPES_H */
|
#endif /* __XTDK_I686_HLTYPES_H */
|
||||||
|
|||||||
@@ -50,7 +50,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,12 +58,6 @@
|
|||||||
#define KIDT_ACCESS_RING0 0x00
|
#define KIDT_ACCESS_RING0 0x00
|
||||||
#define KIDT_ACCESS_RING3 0x60
|
#define KIDT_ACCESS_RING3 0x60
|
||||||
|
|
||||||
/* IDT gate types */
|
|
||||||
#define KIDT_TASK 0x05
|
|
||||||
#define KIDT_CALL 0x0C
|
|
||||||
#define KIDT_INTERRUPT 0x0E
|
|
||||||
#define KIDT_TRAP 0x0F
|
|
||||||
|
|
||||||
/* TSS Offsets */
|
/* TSS Offsets */
|
||||||
#define KTSS_ESP0 0x04
|
#define KTSS_ESP0 0x04
|
||||||
#define KTSS_CR3 0x1C
|
#define KTSS_CR3 0x1C
|
||||||
@@ -88,6 +82,7 @@
|
|||||||
#define KTSS_IO_MAPS 0x68
|
#define KTSS_IO_MAPS 0x68
|
||||||
|
|
||||||
/* I686 Segment Types */
|
/* I686 Segment Types */
|
||||||
|
#define I686_LDT 0x2
|
||||||
#define I686_TASK_GATE 0x5
|
#define I686_TASK_GATE 0x5
|
||||||
#define I686_TSS 0x9
|
#define I686_TSS 0x9
|
||||||
#define I686_ACTIVE_TSS 0xB
|
#define I686_ACTIVE_TSS 0xB
|
||||||
@@ -95,6 +90,62 @@
|
|||||||
#define I686_INTERRUPT_GATE 0xE
|
#define I686_INTERRUPT_GATE 0xE
|
||||||
#define I686_TRAP_GATE 0xF
|
#define I686_TRAP_GATE 0xF
|
||||||
|
|
||||||
|
/* Kernel CPU Standard Features */
|
||||||
|
#define KCF_VME (1ULL << 0) /* Virtual 8086 Mode Enhancements */
|
||||||
|
#define KCF_LARGE_PAGE (1ULL << 1) /* Page Size Extensions */
|
||||||
|
#define KCF_RDTSC (1ULL << 2) /* Time Stamp Counter */
|
||||||
|
#define KCF_PAE (1ULL << 3) /* Physical Address Extension */
|
||||||
|
#define KCF_MCE (1ULL << 4) /* Machine Check Exception */
|
||||||
|
#define KCF_CMPXCHG8B (1ULL << 5) /* CMPXCHG8B Instruction */
|
||||||
|
#define KCF_APIC (1ULL << 6) /* APIC On-Chip */
|
||||||
|
#define KCF_FAST_SYSCALL (1ULL << 7) /* SYSENTER/SYSEXIT Instructions */
|
||||||
|
#define KCF_MTRR (1ULL << 8) /* Memory Type Range Registers */
|
||||||
|
#define KCF_GLOBAL_PAGE (1ULL << 9) /* Page Global Enable */
|
||||||
|
#define KCF_MCA (1ULL << 10) /* Machine Check Architecture */
|
||||||
|
#define KCF_CMOV (1ULL << 11) /* Conditional Move Instructions */
|
||||||
|
#define KCF_PAT (1ULL << 12) /* Page Attribute Table */
|
||||||
|
#define KCF_PSE36 (1ULL << 13) /* 36-bit Page Size Extension */
|
||||||
|
#define KCF_CLFLUSH (1ULL << 14) /* CLFLUSH Instruction */
|
||||||
|
#define KCF_FXSR (1ULL << 15) /* FXSAVE/FXRSTOR Instructions */
|
||||||
|
#define KCF_ACPI (1ULL << 16) /* Thermal Monitor and Software Controlled Clock */
|
||||||
|
#define KCF_MMX (1ULL << 17) /* MMX Technology */
|
||||||
|
#define KCF_SSE (1ULL << 18) /* Streaming SIMD Extensions */
|
||||||
|
#define KCF_SSE2 (1ULL << 19) /* Streaming SIMD Extensions 2 */
|
||||||
|
#define KCF_SMT (1ULL << 20) /* Hyper-Threading Technology */
|
||||||
|
#define KCF_SSE3 (1ULL << 21) /* Streaming SIMD Extensions 3 */
|
||||||
|
#define KCF_VMX (1ULL << 22) /* Intel Virtual Machine Extensions */
|
||||||
|
#define KCF_SSSE3 (1ULL << 23) /* Supplemental SSE3 Instructions */
|
||||||
|
#define KCF_SSE41 (1ULL << 24) /* SSE4.1 Instructions */
|
||||||
|
#define KCF_SSE42 (1ULL << 25) /* SSE4.2 Instructions */
|
||||||
|
#define KCF_X2APIC (1ULL << 26) /* x2APIC Support */
|
||||||
|
#define KCF_POPCNT (1ULL << 27) /* POPCNT Instruction */
|
||||||
|
#define KCF_TSC_DEADLINE (1ULL << 28) /* TSC Deadline Timer */
|
||||||
|
#define KCF_AES (1ULL << 29) /* AES-NI Instruction Set */
|
||||||
|
#define KCF_XSAVE (1ULL << 30) /* XSAVE/XRSTOR Instructions */
|
||||||
|
#define KCF_AVX (1ULL << 31) /* Advanced Vector Extensions */
|
||||||
|
#define KCF_RDRAND (1ULL << 32) /* RDRAND Instruction */
|
||||||
|
#define KCF_FSGSBASE (1ULL << 33) /* RDFSBASE/WRFSBASE Instructions */
|
||||||
|
#define KCF_AVX2 (1ULL << 34) /* AVX2 Instructions */
|
||||||
|
#define KCF_SMEP (1ULL << 35) /* Supervisor Mode Execution Prevention */
|
||||||
|
#define KCF_RDSEED (1ULL << 36) /* RDSEED Instruction */
|
||||||
|
#define KCF_SMAP (1ULL << 37) /* Supervisor Mode Access Prevention */
|
||||||
|
#define KCF_SHA (1ULL << 38) /* SHA Extensions */
|
||||||
|
#define KCF_LA57 (1ULL << 39) /* 57-bit Linear Addresses */
|
||||||
|
#define KCF_ARAT (1ULL << 40) /* Always Running APIC Timer */
|
||||||
|
|
||||||
|
/* Kernel CPU Extended Features */
|
||||||
|
#define KCF_SVM (1ULL << 0) /* AMD Secure Virtual Machine */
|
||||||
|
#define KCF_SSE4A (1ULL << 1) /* SSE4A Instructions */
|
||||||
|
#define KCF_FMA4 (1ULL << 2) /* FMA4 Instructions */
|
||||||
|
#define KCF_TOPOEXT (1ULL << 3) /* AMD Topology Extensions */
|
||||||
|
#define KCF_SYSCALL (1ULL << 4) /* SYSCALL/SYSRET Instructions */
|
||||||
|
#define KCF_NX_BIT (1ULL << 5) /* No-Execute Page Protection */
|
||||||
|
#define KCF_RDTSCP (1ULL << 6) /* RDTSCP Instruction */
|
||||||
|
#define KCF_64BIT (1ULL << 7) /* Long Mode Support */
|
||||||
|
#define KCF_3DNOW_EXT (1ULL << 8) /* 3DNow! Extensions */
|
||||||
|
#define KCF_3DNOW (1ULL << 9) /* 3DNow! Instructions */
|
||||||
|
#define KCF_INVARIANT_TSC (1ULL << 10) /* Invariant Time Stamp Counter */
|
||||||
|
|
||||||
/* Context control flags */
|
/* Context control flags */
|
||||||
#define CONTEXT_ARCHITECTURE 0x00010000
|
#define CONTEXT_ARCHITECTURE 0x00010000
|
||||||
#define CONTEXT_CONTROL (CONTEXT_ARCHITECTURE | 0x01)
|
#define CONTEXT_CONTROL (CONTEXT_ARCHITECTURE | 0x01)
|
||||||
@@ -134,18 +185,16 @@
|
|||||||
/* Static Kernel-Mode address start */
|
/* Static Kernel-Mode address start */
|
||||||
#define KSEG0_BASE 0x80000000
|
#define KSEG0_BASE 0x80000000
|
||||||
|
|
||||||
/* XTOS Kernel address base */
|
|
||||||
#define KSEG0_KERNEL_BASE 0x01800000
|
|
||||||
|
|
||||||
/* XTOS Kernel stack size */
|
/* XTOS Kernel stack size */
|
||||||
#define KERNEL_STACK_SIZE 0x4000
|
#define KERNEL_STACK_SIZE 0x4000
|
||||||
|
#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
|
||||||
|
|
||||||
/* Processor structures size */
|
/* Processor structures size */
|
||||||
#define KPROCESSOR_STRUCTURES_SIZE ((2 * KERNEL_STACK_SIZE) + (GDT_ENTRIES * sizeof(KGDTENTRY)) + sizeof(KTSS) + \
|
#define KPROCESSOR_STRUCTURES_SIZE ((KERNEL_STACKS * KERNEL_STACK_SIZE) + (GDT_ENTRIES * sizeof(KGDTENTRY)) + \
|
||||||
sizeof(KPROCESSOR_BLOCK) + MM_PAGE_SIZE)
|
sizeof(KTSS) + sizeof(KPROCESSOR_BLOCK) + MM_PAGE_SIZE)
|
||||||
|
|
||||||
/* Kernel frames */
|
/* Kernel frames */
|
||||||
#define KTRAP_FRAME_ALIGN 0x08
|
#define KTRAP_FRAME_ALIGN 0x08
|
||||||
@@ -166,6 +215,10 @@
|
|||||||
#define NPX_STATE_LOADED 0x0
|
#define NPX_STATE_LOADED 0x0
|
||||||
#define NPX_STATE_UNLOADED 0xA
|
#define NPX_STATE_UNLOADED 0xA
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* Floating point state storing structure */
|
/* Floating point state storing structure */
|
||||||
typedef struct _FN_SAVE_FORMAT
|
typedef struct _FN_SAVE_FORMAT
|
||||||
{
|
{
|
||||||
@@ -284,7 +337,18 @@ typedef struct _KIDTENTRY
|
|||||||
{
|
{
|
||||||
USHORT Offset;
|
USHORT Offset;
|
||||||
USHORT Selector;
|
USHORT Selector;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
UCHAR Reserved;
|
||||||
|
UCHAR Type:4;
|
||||||
|
UCHAR Flag:1;
|
||||||
|
UCHAR Dpl:2;
|
||||||
|
UCHAR Present:1;
|
||||||
|
};
|
||||||
USHORT Access;
|
USHORT Access;
|
||||||
|
};
|
||||||
USHORT ExtendedOffset;
|
USHORT ExtendedOffset;
|
||||||
} KIDTENTRY, *PKIDTENTRY;
|
} KIDTENTRY, *PKIDTENTRY;
|
||||||
|
|
||||||
@@ -335,10 +399,14 @@ typedef struct _KTSS
|
|||||||
UCHAR IntDirectionMap[IOPM_DIRECTION_MAP_SIZE];
|
UCHAR IntDirectionMap[IOPM_DIRECTION_MAP_SIZE];
|
||||||
} KTSS, *PKTSS;
|
} KTSS, *PKTSS;
|
||||||
|
|
||||||
/* Exception frame definition (not available on ia32) */
|
/* Exception frame definition (not available on i686) */
|
||||||
typedef struct _KEXCEPTION_FRAME
|
typedef struct _KEXCEPTION_FRAME
|
||||||
{
|
{
|
||||||
ULONG PlaceHolder;
|
ULONG Ebp;
|
||||||
|
ULONG Ebx;
|
||||||
|
ULONG Edi;
|
||||||
|
ULONG Esi;
|
||||||
|
ULONG Return;
|
||||||
} KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
|
} KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
|
||||||
|
|
||||||
/* Thread start frame definition */
|
/* Thread start frame definition */
|
||||||
@@ -419,6 +487,17 @@ typedef struct _KSPECIAL_REGISTERS
|
|||||||
ULONG Reserved[6];
|
ULONG Reserved[6];
|
||||||
} KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
|
} KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
|
||||||
|
|
||||||
|
/* Processor start block structure definition */
|
||||||
|
typedef struct _PROCESSOR_START_BLOCK
|
||||||
|
{
|
||||||
|
ULONG_PTR Cr3;
|
||||||
|
ULONG_PTR Cr4;
|
||||||
|
PVOID EntryPoint;
|
||||||
|
PVOID ProcessorStructures;
|
||||||
|
PVOID Stack;
|
||||||
|
BOOLEAN Started;
|
||||||
|
} PROCESSOR_START_BLOCK, *PPROCESSOR_START_BLOCK;
|
||||||
|
|
||||||
/* Processor state frame structure definition */
|
/* Processor state frame structure definition */
|
||||||
typedef struct _KPROCESSOR_STATE
|
typedef struct _KPROCESSOR_STATE
|
||||||
{
|
{
|
||||||
@@ -444,6 +523,7 @@ typedef struct _KPROCESSOR_CONTROL_BLOCK
|
|||||||
VOLATILE ULONG_PTR TimerRequest;
|
VOLATILE ULONG_PTR TimerRequest;
|
||||||
SINGLE_LIST_ENTRY DeferredReadyListHead;
|
SINGLE_LIST_ENTRY DeferredReadyListHead;
|
||||||
PROCESSOR_POWER_STATE PowerState;
|
PROCESSOR_POWER_STATE PowerState;
|
||||||
|
ULONG ProfilingCountdown;
|
||||||
} KPROCESSOR_CONTROL_BLOCK, *PKPROCESSOR_CONTROL_BLOCK;
|
} KPROCESSOR_CONTROL_BLOCK, *PKPROCESSOR_CONTROL_BLOCK;
|
||||||
|
|
||||||
/* Processor Block structure definition */
|
/* Processor Block structure definition */
|
||||||
@@ -470,6 +550,9 @@ typedef struct _KPROCESSOR_BLOCK
|
|||||||
KAFFINITY SetMember;
|
KAFFINITY SetMember;
|
||||||
ULONG StallScaleFactor;
|
ULONG StallScaleFactor;
|
||||||
UCHAR CpuNumber;
|
UCHAR CpuNumber;
|
||||||
|
ULONG HardwareId;
|
||||||
|
VOLATILE BOOLEAN Started;
|
||||||
|
PINTERRUPT_HANDLER InterruptDispatchTable[256];
|
||||||
} KPROCESSOR_BLOCK, *PKPROCESSOR_BLOCK;
|
} KPROCESSOR_BLOCK, *PKPROCESSOR_BLOCK;
|
||||||
|
|
||||||
/* Thread Environment Block (TEB) structure definition */
|
/* Thread Environment Block (TEB) structure definition */
|
||||||
@@ -478,4 +561,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_I686_KETYPES_H */
|
#endif /* __XTDK_I686_KETYPES_H */
|
||||||
|
|||||||
@@ -35,9 +35,58 @@
|
|||||||
#define MM_PTE_LEGACY_SHIFT 2
|
#define MM_PTE_LEGACY_SHIFT 2
|
||||||
#define MM_PDI_LEGACY_SHIFT 22
|
#define MM_PDI_LEGACY_SHIFT 22
|
||||||
|
|
||||||
|
/* PTE state flags */
|
||||||
|
#define MM_PTE_VALID 0x00000001
|
||||||
|
#define MM_PTE_ACCESSED 0x00000020
|
||||||
|
#define MM_PTE_DIRTY 0x00000040
|
||||||
|
|
||||||
|
/* PTE scope flags */
|
||||||
|
#define MM_PTE_LARGE_PAGE 0x00000080
|
||||||
|
#define MM_PTE_GLOBAL 0x00000100
|
||||||
|
|
||||||
|
/* PTE access flags */
|
||||||
|
#define MM_PTE_NOACCESS 0x00000000
|
||||||
|
#define MM_PTE_READONLY 0x00000000
|
||||||
|
#define MM_PTE_EXECUTE 0x00000000
|
||||||
|
#define MM_PTE_EXECUTE_READ 0x00000000
|
||||||
|
#define MM_PTE_READWRITE 0x00000002
|
||||||
|
#define MM_PTE_WRITECOPY 0x00000200
|
||||||
|
#define MM_PTE_EXECUTE_READWRITE 0x00000002
|
||||||
|
#define MM_PTE_EXECUTE_WRITECOPY 0x00000200
|
||||||
|
|
||||||
|
/* PTE protection flags */
|
||||||
|
#define MM_PTE_NOEXECUTE 0x00000000
|
||||||
|
#define MM_PTE_GUARDED 0x00000018
|
||||||
|
#define MM_PTE_PROTECT 0x00000612
|
||||||
|
|
||||||
|
/* PTE cache flags */
|
||||||
|
#define MM_PTE_CACHE_ENABLE 0x00000000
|
||||||
|
#define MM_PTE_CACHE_DISABLE 0x00000010
|
||||||
|
#define MM_PTE_CACHE_WRITECOMBINED 0x00000010
|
||||||
|
#define MM_PTE_CACHE_WRITETHROUGH 0x00000008
|
||||||
|
|
||||||
|
/* PTE software flags */
|
||||||
|
#define MM_PTE_COPY_ON_WRITE 0x00000200
|
||||||
|
#define MM_PTE_PROTOTYPE 0x00000400
|
||||||
|
#define MM_PTE_TRANSITION 0x00000800
|
||||||
|
|
||||||
|
/* PTE frame bits */
|
||||||
|
#define MM_PTE_FRAME_BITS 25
|
||||||
|
|
||||||
|
/* PTE protection bits */
|
||||||
|
#define MM_PTE_PROTECTION_BITS 5
|
||||||
|
|
||||||
|
/* Base address of the system page table */
|
||||||
|
#define MM_SYSTEM_PTE_BASE NULLPTR
|
||||||
|
|
||||||
/* Minimum number of physical pages needed by the system */
|
/* Minimum number of physical pages needed by the system */
|
||||||
#define MM_MINIMUM_PHYSICAL_PAGES 1100
|
#define MM_MINIMUM_PHYSICAL_PAGES 1100
|
||||||
|
|
||||||
|
/* Number of system PTEs */
|
||||||
|
#define MM_MINIMUM_NUMBER_SYSTEM_PTES 7000
|
||||||
|
#define MM_DEFAULT_NUMBER_SYSTEM_PTES 11000
|
||||||
|
#define MM_MAXIMUM_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
|
||||||
|
|
||||||
@@ -50,12 +99,31 @@
|
|||||||
/* HAL memory pool virtual address start */
|
/* HAL memory pool virtual address start */
|
||||||
#define MM_HARDWARE_VA_START 0xFFC00000
|
#define MM_HARDWARE_VA_START 0xFFC00000
|
||||||
|
|
||||||
|
/* Kernel shared data address */
|
||||||
|
#define MM_KERNEL_SHARED_DATA_ADDRESS 0xFFDF0000
|
||||||
|
|
||||||
/* Maximum physical address used by HAL allocations */
|
/* Maximum physical address used by HAL allocations */
|
||||||
#define MM_MAXIMUM_PHYSICAL_ADDRESS 0xFFFFFFFF
|
#define MM_MAXIMUM_PHYSICAL_ADDRESS 0xFFFFFFFF
|
||||||
|
|
||||||
|
/* Highest system address */
|
||||||
|
#define MM_HIGHEST_SYSTEM_ADDRESS 0xFFFFFFFF
|
||||||
|
|
||||||
/* Trampoline code address */
|
/* Trampoline code address */
|
||||||
#define MM_TRAMPOLINE_ADDRESS 0x80000
|
#define MM_TRAMPOLINE_ADDRESS 0x80000
|
||||||
|
|
||||||
|
/* Pool block size */
|
||||||
|
#define MM_POOL_BLOCK_SIZE 8
|
||||||
|
|
||||||
|
/* 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 32
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* Page size enumeration list */
|
/* Page size enumeration list */
|
||||||
typedef enum _PAGE_SIZE
|
typedef enum _PAGE_SIZE
|
||||||
{
|
{
|
||||||
@@ -106,7 +174,6 @@ typedef struct _HARDWARE_MODERN_PTE
|
|||||||
/* Generic Page Table entry union to abstract PML2 and PML3 formats */
|
/* Generic Page Table entry union to abstract PML2 and PML3 formats */
|
||||||
typedef union _HARDWARE_PTE
|
typedef union _HARDWARE_PTE
|
||||||
{
|
{
|
||||||
ULONGLONG Long;
|
|
||||||
HARDWARE_LEGACY_PTE Pml2;
|
HARDWARE_LEGACY_PTE Pml2;
|
||||||
HARDWARE_MODERN_PTE Pml3;
|
HARDWARE_MODERN_PTE Pml3;
|
||||||
} HARDWARE_PTE, *PHARDWARE_PTE;
|
} HARDWARE_PTE, *PHARDWARE_PTE;
|
||||||
@@ -201,12 +268,12 @@ typedef struct _MMPML2_PTE_TRANSITION
|
|||||||
typedef union _MMPML2_PTE
|
typedef union _MMPML2_PTE
|
||||||
{
|
{
|
||||||
ULONG Long;
|
ULONG Long;
|
||||||
HARDWARE_PTE Flush;
|
HARDWARE_LEGACY_PTE Flush;
|
||||||
MMPML2_PTE_HARDWARE Hard;
|
MMPML2_PTE_HARDWARE Hardware;
|
||||||
MMPML2_PTE_PROTOTYPE Proto;
|
MMPML2_PTE_PROTOTYPE Prototype;
|
||||||
MMPML2_PTE_SOFTWARE Soft;
|
MMPML2_PTE_SOFTWARE Software;
|
||||||
MMPML2_PTE_TRANSITION Trans;
|
MMPML2_PTE_TRANSITION Transition;
|
||||||
MMPML2_PTE_SUBSECTION Subsect;
|
MMPML2_PTE_SUBSECTION Subsection;
|
||||||
MMPML2_PTE_LIST List;
|
MMPML2_PTE_LIST List;
|
||||||
} MMPML2_PTE, *PMMPML2_PTE;
|
} MMPML2_PTE, *PMMPML2_PTE;
|
||||||
|
|
||||||
@@ -296,7 +363,7 @@ typedef struct _MMPML3_PTE_TRANSITION
|
|||||||
typedef union _MMPML3_PTE
|
typedef union _MMPML3_PTE
|
||||||
{
|
{
|
||||||
ULONGLONG Long;
|
ULONGLONG Long;
|
||||||
HARDWARE_PTE Flush;
|
HARDWARE_MODERN_PTE Flush;
|
||||||
MMPML3_PTE_HARDWARE Hardware;
|
MMPML3_PTE_HARDWARE Hardware;
|
||||||
MMPML3_PTE_PROTOTYPE Prototype;
|
MMPML3_PTE_PROTOTYPE Prototype;
|
||||||
MMPML3_PTE_SOFTWARE Software;
|
MMPML3_PTE_SOFTWARE Software;
|
||||||
@@ -308,7 +375,6 @@ typedef union _MMPML3_PTE
|
|||||||
/* Generic Page Table Entry union to abstract PML2 and PML3 formats */
|
/* Generic Page Table Entry union to abstract PML2 and PML3 formats */
|
||||||
typedef union _MMPTE
|
typedef union _MMPTE
|
||||||
{
|
{
|
||||||
ULONGLONG Long;
|
|
||||||
MMPML2_PTE Pml2;
|
MMPML2_PTE Pml2;
|
||||||
MMPML3_PTE Pml3;
|
MMPML3_PTE Pml3;
|
||||||
} MMPTE, *PMMPTE;
|
} MMPTE, *PMMPTE;
|
||||||
@@ -339,6 +405,7 @@ typedef struct _MMPFN
|
|||||||
USHORT ReferenceCount;
|
USHORT ReferenceCount;
|
||||||
} e2;
|
} e2;
|
||||||
} u3;
|
} u3;
|
||||||
|
ULONG UsedPageTableEntries;
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
MMPTE OriginalPte;
|
MMPTE OriginalPte;
|
||||||
@@ -349,15 +416,33 @@ typedef struct _MMPFN
|
|||||||
ULONG_PTR EntireFrame;
|
ULONG_PTR EntireFrame;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
ULONG_PTR PteFrame:26;
|
ULONG_PTR PteFrame:25;
|
||||||
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_I686_MMTYPES_H */
|
#endif /* __XTDK_I686_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;
|
||||||
@@ -30,6 +37,7 @@ typedef enum _PIC_I8259_ICW1_OPERATING_MODE PIC_I8259_ICW1_OPERATING_MODE, *PPIC
|
|||||||
typedef enum _PIC_I8259_ICW4_BUFFERED_MODE PIC_I8259_ICW4_BUFFERED_MODE, *PPIC_I8259_ICW4_BUFFERED_MODE;
|
typedef enum _PIC_I8259_ICW4_BUFFERED_MODE PIC_I8259_ICW4_BUFFERED_MODE, *PPIC_I8259_ICW4_BUFFERED_MODE;
|
||||||
typedef enum _PIC_I8259_ICW4_EOI_MODE PIC_I8259_ICW4_EOI_MODE, *PPIC_I8259_ICW4_EOI_MODE;
|
typedef enum _PIC_I8259_ICW4_EOI_MODE PIC_I8259_ICW4_EOI_MODE, *PPIC_I8259_ICW4_EOI_MODE;
|
||||||
typedef enum _PIC_I8259_ICW4_SYSTEM_MODE PIC_I8259_ICW4_SYSTEM_MODE, *PPIC_I8259_ICW4_SYSTEM_MODE;
|
typedef enum _PIC_I8259_ICW4_SYSTEM_MODE PIC_I8259_ICW4_SYSTEM_MODE, *PPIC_I8259_ICW4_SYSTEM_MODE;
|
||||||
|
typedef enum _TIMER_TYPE TIMER_TYPE, *PTIMER_TYPE;
|
||||||
typedef enum _TRAMPOLINE_TYPE TRAMPOLINE_TYPE, *PTRAMPOLINE_TYPE;
|
typedef enum _TRAMPOLINE_TYPE TRAMPOLINE_TYPE, *PTRAMPOLINE_TYPE;
|
||||||
|
|
||||||
/* Architecture-specific structures forward references */
|
/* Architecture-specific structures forward references */
|
||||||
@@ -42,6 +50,8 @@ typedef struct _FX_SAVE_AREA FX_SAVE_AREA, *PFX_SAVE_AREA;
|
|||||||
typedef struct _FX_SAVE_FORMAT FX_SAVE_FORMAT, *PFX_SAVE_FORMAT;
|
typedef struct _FX_SAVE_FORMAT FX_SAVE_FORMAT, *PFX_SAVE_FORMAT;
|
||||||
typedef struct _HARDWARE_LEGACY_PTE HARDWARE_LEGACY_PTE, *PHARDWARE_LEGACY_PTE;
|
typedef struct _HARDWARE_LEGACY_PTE HARDWARE_LEGACY_PTE, *PHARDWARE_LEGACY_PTE;
|
||||||
typedef struct _HARDWARE_MODERN_PTE HARDWARE_MODERN_PTE, *PHARDWARE_MODERN_PTE;
|
typedef struct _HARDWARE_MODERN_PTE HARDWARE_MODERN_PTE, *PHARDWARE_MODERN_PTE;
|
||||||
|
typedef struct _HPET_REGISTERS HPET_REGISTERS, *PHPET_REGISTERS;
|
||||||
|
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;
|
||||||
@@ -70,7 +80,9 @@ typedef struct _MMPML3_PTE_PROTOTYPE MMPML3_PTE_PROTOTYPE, *PMMPML3_PTE_PROTOTYP
|
|||||||
typedef struct _MMPML3_PTE_SOFTWARE MMPML3_PTE_SOFTWARE, *PMMPML3_PTE_SOFTWARE;
|
typedef struct _MMPML3_PTE_SOFTWARE MMPML3_PTE_SOFTWARE, *PMMPML3_PTE_SOFTWARE;
|
||||||
typedef struct _MMPML3_PTE_SUBSECTION MMPML3_PTE_SUBSECTION, *PMMPML3_PTE_SUBSECTION;
|
typedef struct _MMPML3_PTE_SUBSECTION MMPML3_PTE_SUBSECTION, *PMMPML3_PTE_SUBSECTION;
|
||||||
typedef struct _MMPML3_PTE_TRANSITION MMPML3_PTE_TRANSITION, *PMMPML3_PTE_TRANSITION;
|
typedef struct _MMPML3_PTE_TRANSITION MMPML3_PTE_TRANSITION, *PMMPML3_PTE_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;
|
||||||
@@ -78,6 +90,7 @@ typedef union _APIC_COMMAND_REGISTER APIC_COMMAND_REGISTER, *PAPIC_COMMAND_REGIS
|
|||||||
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 _HARDWARE_PTE HARDWARE_PTE, *PHARDWARE_PTE;
|
typedef union _HARDWARE_PTE HARDWARE_PTE, *PHARDWARE_PTE;
|
||||||
|
typedef union _IOAPIC_REDIRECTION_REGISTER IOAPIC_REDIRECTION_REGISTER, *PIOAPIC_REDIRECTION_REGISTER;
|
||||||
typedef union _MMPML2_PTE MMPML2_PTE, *PMMPML2_PTE;
|
typedef union _MMPML2_PTE MMPML2_PTE, *PMMPML2_PTE;
|
||||||
typedef union _MMPML3_PTE MMPML3_PTE, *PMMPML3_PTE;
|
typedef union _MMPML3_PTE MMPML3_PTE, *PMMPML3_PTE;
|
||||||
typedef union _MMPTE MMPDE, *PMMPDE;
|
typedef union _MMPTE MMPDE, *PMMPDE;
|
||||||
@@ -88,4 +101,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_I686_XTSTRUCT_H */
|
#endif /* __XTDK_I686_XTSTRUCT_H */
|
||||||
|
|||||||
@@ -58,6 +58,10 @@
|
|||||||
#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
|
#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
|
||||||
#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
|
#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* PCI bridge control registers */
|
/* PCI bridge control registers */
|
||||||
typedef struct _PCI_BRIDGE_CONTROL_REGISTER
|
typedef struct _PCI_BRIDGE_CONTROL_REGISTER
|
||||||
{
|
{
|
||||||
@@ -214,4 +218,5 @@ typedef struct _PCI_TYPE1_DEVICE
|
|||||||
PCI_BRIDGE_CONTROL_REGISTER Bridge;
|
PCI_BRIDGE_CONTROL_REGISTER Bridge;
|
||||||
} PCI_TYPE1_DEVICE, *PPCI_TYPE1_DEVICE;
|
} PCI_TYPE1_DEVICE, *PPCI_TYPE1_DEVICE;
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_IOTYPES_H */
|
#endif /* __XTDK_IOTYPES_H */
|
||||||
|
|||||||
@@ -13,6 +13,9 @@
|
|||||||
#include <xttypes.h>
|
#include <xttypes.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* C/C++ specific code */
|
||||||
|
#ifndef __XTOS_ASSEMBLER__
|
||||||
|
|
||||||
/* Kernel debugger routines forward references */
|
/* Kernel debugger routines forward references */
|
||||||
XTCLINK
|
XTCLINK
|
||||||
XTCDECL
|
XTCDECL
|
||||||
@@ -20,4 +23,5 @@ VOID
|
|||||||
DbgPrint(PCWSTR Format,
|
DbgPrint(PCWSTR Format,
|
||||||
...);
|
...);
|
||||||
|
|
||||||
|
#endif /* __XTOS_ASSEMBLER__ */
|
||||||
#endif /* __XTDK_KDFUNCS_H */
|
#endif /* __XTDK_KDFUNCS_H */
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user