├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md ├── arch.asm ├── download.vbs ├── driver.asm ├── hello.asm ├── include ├── ebc.inc ├── efi.inc ├── format.inc ├── pe.inc ├── stub.com └── utf8.inc ├── intel ├── Readme.txt ├── ebcdemo.asm └── ebctest.asm ├── internal ├── Readme.txt ├── full.asm └── test.asm ├── machine.asm ├── make.cmd ├── native ├── .msvc │ ├── gnu-efi.vcxproj │ ├── gnu-efi.vcxproj.filters │ ├── gnu-efi.vcxproj.user │ ├── native.vcxproj │ ├── native.vcxproj.filters │ └── native.vcxproj.user ├── Makefile ├── native.c ├── native.sln ├── native_aa64.efi ├── native_arm.efi ├── native_ia32.efi └── native_x64.efi ├── printhex.asm ├── protocol.asm ├── protocol_driver ├── Makefile ├── Readme.txt ├── driver.c ├── driver_aa64.efi ├── driver_arm.efi ├── driver_ia32.efi └── driver_x64.efi ├── stack.asm └── stack_tracker ├── Readme.txt ├── cloaked.asm ├── driver ├── .msvc │ ├── driver.vcxproj │ ├── driver.vcxproj.filters │ ├── driver.vcxproj.user │ ├── gnu-efi.vcxproj │ ├── gnu-efi.vcxproj.filters │ └── gnu-efi.vcxproj.user ├── Makefile ├── Readme.txt ├── driver.c ├── driver.sln ├── driver_arm.efi └── driver_ia32.efi ├── head.inc ├── make.cmd ├── matrix.asm ├── max.asm ├── realloc.asm ├── shutdown.asm ├── switch.asm └── tail.inc /.gitignore: -------------------------------------------------------------------------------- 1 | *.efi 2 | !native/*.efi 3 | !protocol_driver/*.efi 4 | !stacktracker/driver/*.efi 5 | *.exe 6 | *.fd 7 | image 8 | 9 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "gnu-efi"] 2 | path = gnu-efi 3 | url = git://git.code.sf.net/p/gnu-efi/code 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | fasmg-ebc - EBC (EFI Byte Code) assembler for fasmg 2 | =================================================== 3 | 4 | _Because programming in assembler for UEFI is easy and nobody should have to 5 | [pay](https://software.intel.com/en-us/articles/intel-c-compiler-for-efi-byte-code-purchase) 6 | to produce EBC executables..._ 7 | 8 | ## FINAL UPDATE - 2023.03.09 9 | 10 | This repository is archived, which means that it will not see any changes or any new development. 11 | 12 | ## Prerequisites 13 | 14 | * [QEMU](http://www.qemu.org) __v2.7 or later__ 15 | NB: You can find QEMU Windows binaries [here](https://qemu.weilnetz.de/w64/). 16 | Make sure you use QEMU 2.7 or later, as earlier versions may produce a `Synchronous Exception` on AARCH64. 17 | * git (e.g. [TortoiseGit](https://tortoisegit.org/) for Windows). 18 | 19 | ## Instructions and syntax 20 | 21 | See Chapter 21 (_EFI Byte Code Virtual Machine_) of the [UEFI Specifications](http://www.uefi.org/sites/default/files/resources/UEFI%20Spec%202_6.pdf#page=1001). 22 | 23 | This assembler accepts not specifying a size for arithmetic or comparison operations, in which 24 | case the 64-bit version is used (since all EBC registers are 64 bit). This means that `XOR R1, R2` 25 | will be converted to `XOR64 R1, R2`. 26 | 27 | For `JMP`/`CALL[EX]` operations where you do not specify a size, the assembler will also insert 28 | the most appropriate version. 29 | For instance `CALL @R1` will be converted to `CALL32 @R1` whereas `CALL 0x1234` will be converted 30 | to `CALL64 0x1234`. 31 | 32 | Also, if you are using a label with `JMP` or `CALL`, the assembler will convert it to a relative offset. 33 | For instance, say you have the following code: 34 | ``` 35 | Label: 36 | (...) 37 | JMPcc Label 38 | ``` 39 | Then `JMPcc` will either be converted to `JMP8cc ` or `JMP32cc R0()` or `JMP64cc ` 40 | with `` being the relative value required for each specific instruction size, to point to `Label`. 41 | 42 | The assembler can also guess the size of indexes or immediates, if you don't explicitly specify one. 43 | For instance `MOVIn R1, (+2,+8)` gets assembled as `MOVInw R1, (+2,+8)` whereas `MOVIn R1, (+2,+4096)` 44 | gets assembled as `MOVInd R1, (+2,+4096)`. 45 | 46 | Finally, if you use the `struct` macro to define a set of EFI structures, the assembler will convert member 47 | references to their equivalent indexes. This means that something like this: 48 | ``` 49 | MOVn R1, @R1(EFI_SYSTEM_TABLE.ConOut) 50 | ``` 51 | gets assembled as: 52 | ``` 53 | MOVn R1, @R1(+5,+24) 54 | ``` 55 | Oh, and this conversion is smart enough to handle alignment computations, such that an `UINT32` (aligned to 56 | natural size) followed by an `UINT64` does generate `(+1,+0)` for the `UINT64` index and not `(+0,+4)`. 57 | For more, see `efi.inc` and `hello.asm`. 58 | 59 | ## Assembly and testing (Windows) 60 | 61 | * Run `make` to compile the `hello.asm` sample. If not already available, the latest fasmg binary is 62 | downloaded automatically. 63 | * Additionally, you can compile one of the other samples by providing its short name (e.g. `make arch`) 64 | * If you have QEMU installed, you can add a `qemu` parameter to run the application (e.g. `make hello qemu`) 65 | You may also add one of `x64`, `ia32`, `arm` and `aa64` to run the application against a specific UEFI 66 | architecture (e.g. `make hello qemu aa64`) 67 | * If you wish to debug the samples with the EBC Debugger, simply replace `qemu` with `debug` 68 | (e.g. `make arch debug arm`). The EBC Debugger will be automatically downloaded for the required arch. 69 | 70 | __Note:__ The assembler itself is really only comprised of the files you can find under `include\`. 71 | __Everything else__ is just samples or test data. 72 | -------------------------------------------------------------------------------- /arch.asm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/arch.asm -------------------------------------------------------------------------------- /download.vbs: -------------------------------------------------------------------------------- 1 | ' 2 | ' Download and unzip script. 3 | ' 4 | 5 | URL_BASE = WScript.Arguments(0) 6 | ZIP_FILE = WScript.Arguments(1) 7 | SRC_FILE = WScript.Arguments(2) 8 | DST_FILE = WScript.Arguments(3) 9 | MSG_TEXT = WScript.Arguments(4) 10 | 11 | ' Globals 12 | Set fso = CreateObject("Scripting.FileSystemObject") 13 | Set shell = CreateObject("WScript.Shell") 14 | 15 | ' Download a file from HTTP 16 | Sub DownloadHttp(Url, File) 17 | Const BINARY = 1 18 | Const OVERWRITE = 2 19 | Set xHttp = createobject("Microsoft.XMLHTTP") 20 | Set bStrm = createobject("Adodb.Stream") 21 | Call xHttp.Open("GET", Url, False) 22 | ' Disable caching for downloads 23 | Call xHttp.SetRequestHeader("If-None-Match", "some-random-string") 24 | Call xHttp.SetRequestHeader("Cache-Control", "no-cache,max-age=0") 25 | Call xHttp.SetRequestHeader("Pragma", "no-cache") 26 | Call xHttp.Send() 27 | If Not xHttp.Status = 200 Then 28 | Call WScript.Echo("Unable to access file - Error " & xHttp.Status) 29 | Call WScript.Quit(1) 30 | End If 31 | With bStrm 32 | .type = BINARY 33 | .open 34 | .write xHttp.responseBody 35 | .savetofile File, OVERWRITE 36 | End With 37 | End Sub 38 | 39 | ' Unzip a specific file from an archive 40 | Sub Unzip(Archive, File) 41 | Const NOCONFIRMATION = &H10& 42 | Const NOERRORUI = &H400& 43 | Const SIMPLEPROGRESS = &H100& 44 | unzipFlags = NOCONFIRMATION + NOERRORUI + SIMPLEPROGRESS 45 | Set objShell = CreateObject("Shell.Application") 46 | Set objSource = objShell.NameSpace(fso.GetAbsolutePathName(Archive)).Items() 47 | Set objTarget = objShell.NameSpace(fso.GetAbsolutePathName(".")) 48 | ' Only extract the file we are interested in 49 | For i = 0 To objSource.Count - 1 50 | If objSource.Item(i).Name = File Then 51 | Call objTarget.CopyHere(objSource.Item(i), unzipFlags) 52 | End If 53 | Next 54 | End Sub 55 | 56 | ' Fetch the file, unzip it and rename it 57 | If Not fso.FileExists(DST_FILE) Then 58 | Call WScript.Echo(vbCrLf & MSG_TEXT & " is being downloaded from: " &_ 59 | vbCrLf & URL_BASE & "/" & ZIP_FILE & vbCrLf &_ 60 | "Note: Unless you delete the file, this should only happen once.") 61 | Call DownloadHttp(URL_BASE & "/" & ZIP_FILE, ZIP_FILE) 62 | End If 63 | If Not fso.FileExists(ZIP_FILE) And Not fso.FileExists(DST_FILE) Then 64 | Call WScript.Echo("There was a problem downloading the file.") 65 | Call WScript.Quit(1) 66 | End If 67 | If fso.FileExists(ZIP_FILE) Then 68 | Call Unzip(ZIP_FILE, SRC_FILE) 69 | Call fso.MoveFile(SRC_FILE, DST_FILE) 70 | Call fso.DeleteFile(ZIP_FILE) 71 | End If 72 | If Not fso.FileExists(DST_FILE) Then 73 | Call WScript.Echo("There was a problem unzipping the file.") 74 | Call WScript.Quit(1) 75 | End If 76 | -------------------------------------------------------------------------------- /driver.asm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/driver.asm -------------------------------------------------------------------------------- /hello.asm: -------------------------------------------------------------------------------- 1 | ; 2 | ; EBC (EFI Byte Code) assembly 'Hello World' 3 | ; Copyright © 2016 Pete Batard - Public Domain 4 | ; 5 | 6 | include 'ebc.inc' 7 | include 'efi.inc' 8 | include 'format.inc' 9 | include 'utf8.inc' 10 | 11 | format peebc efi 12 | entry EfiMain 13 | 14 | ; Assembly notes: 15 | ; - Uses PUSHn (PUSH native) for external calls 16 | ; - Function parameters are pushed in reverse order (CDECL) 17 | ; - R0 is the stack pointer, so MOV R0, R0(+2,0) is equivalent to 2 x POPn 18 | 19 | section '.text' code executable readable 20 | EfiMain: 21 | MOVn R1, @R0(EFI_MAIN_PARAMETERS.SystemTable) 22 | MOVn R1, @R1(EFI_SYSTEM_TABLE.ConOut) 23 | MOVREL R2, Hello 24 | PUSHn R2 25 | PUSHn R1 26 | CALLEX @R1(SIMPLE_TEXT_OUTPUT_INTERFACE.OutputString) 27 | MOV R0, R0(+2,0) 28 | 29 | MOVn R1, @R0(EFI_MAIN_PARAMETERS.SystemTable) 30 | MOVn R1, @R1(EFI_SYSTEM_TABLE.ConIn) 31 | MOVI R2, FALSE 32 | PUSHn R2 33 | PUSHn R1 34 | CALLEX @R1(SIMPLE_TEXT_INPUT_INTERFACE.Reset) 35 | POPn R1 36 | POPn R2 37 | 38 | MOVn R3, @R0(EFI_MAIN_PARAMETERS.SystemTable) 39 | MOVn R3, @R3(EFI_SYSTEM_TABLE.BootServices) 40 | MOVREL R2, Event 41 | PUSHn R2 42 | MOV R1, R1(SIMPLE_TEXT_INPUT_INTERFACE.WaitForKey) 43 | PUSHn R1 44 | MOVI R1, 1 45 | PUSHn R1 46 | CALLEX @R3(EFI_BOOT_SERVICES.WaitForEvent) 47 | MOV R0, R0(+3,0) 48 | 49 | MOVn R6, @R0(EFI_MAIN_PARAMETERS.SystemTable) 50 | MOVn R6, @R6(EFI_SYSTEM_TABLE.RuntimeServices) 51 | MOVI R1, EfiResetShutdown 52 | MOVI R2, EFI_SUCCESS 53 | MOVI R3, 0 54 | PUSHn R3 55 | PUSHn R3 56 | PUSHn R2 57 | PUSHn R1 58 | CALLEX @R6(EFI_RUNTIME_SERVICES.ResetSystem) 59 | MOV R0, R0(+4,0) 60 | RET 61 | 62 | section '.data' data readable writeable 63 | Event: dq ? 64 | Hello: du 0x0D, 0x0A 65 | du "Hello EBC World!", 0x0D, 0x0A 66 | du 0x0D, 0x0A 67 | du "Press any key to exit", 0x0D, 0x0A 68 | du 0x00 69 | -------------------------------------------------------------------------------- /include/ebc.inc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/include/ebc.inc -------------------------------------------------------------------------------- /include/efi.inc: -------------------------------------------------------------------------------- 1 | ; 2 | ; Copyright © 2016 Pete Batard 3 | ; Copyright © 2016 Tomasz Grysztar 4 | ; 5 | 6 | element S 7 | 8 | element BOOLEAN? : S + 1 9 | element INT8? : S + 1 10 | element UINT8? : S + 1 11 | element INT16? : S + 2 12 | element UINT16? : S + 2 13 | element INT32? : S + 4 14 | element UINT32? : S + 4 15 | element INT64? : S + 8 16 | element UINT64? : S + 8 17 | element INTN? : S - 8 ; negative => natural value 18 | element UINTN? : S - 8 19 | element VOID_PTR? : S - 8 20 | element EFI_STATUS? : S - 8 21 | element EFI_HANDLE? : S - 8 22 | 23 | ; Helper macros for automated index and alignment computation 24 | ; (e.g. UINT32 followed by UINT64 results in (+1,+0) rather than (+0,+4)). 25 | 26 | ; Returns the base element size for constructs like 'rq 4' or 'dw ?' 27 | macro get_element_size size, def& 28 | local n 29 | match element =?, def 30 | n = 1 31 | else match rt val, def 32 | n = val 33 | else 34 | err 'unsupported declaration' 35 | end match 36 | virtual at 0 37 | def 38 | size = $ / n 39 | end virtual 40 | end macro 41 | 42 | macro struct? name 43 | define name 0 44 | namespace name 45 | virtual at 0 46 | name.__n = 0 ; current number of natural elements 47 | name.__size = 0 ; current struct size 48 | 49 | struc ? def& 50 | local n, c, s, i, as_is 51 | as_is = 0 52 | i = 0 53 | match a b, def 54 | as_is = 1 55 | get_element_size s, def 56 | else 57 | if def metadata 1 relativeto S 58 | s = def metadata 1 - S 59 | else 60 | ; we assert that any reference to a substructure is aligned to natural word 61 | ; so that we can just add its existing n and c to our computed values 62 | if ($ mod 8 <> 0) 63 | err 'substructure must be aligned to natural word' 64 | end if 65 | s = def.__size 66 | i = i + def.__n 67 | end if 68 | if (s < 0) 69 | i = 1 70 | s = -s 71 | end if 72 | end match 73 | if (s = 8) & ((($+3) and (not 3)) <> (($+7) and (not 7))) 74 | name.__n = name.__n + 1 ; alignment correction required 75 | end if 76 | align s 77 | c = $ - (8 * name.__n) 78 | n = name.__n 79 | assert (n >= 0) 80 | assert (c >= 0) 81 | . equ +n,+c 82 | if (as_is) 83 | def 84 | else 85 | rb s 86 | end if 87 | name.__n = name.__n + i 88 | name.__size = $ 89 | end struc 90 | end macro 91 | 92 | macro ends? 93 | restruc ? 94 | end virtual 95 | end namespace 96 | end macro 97 | 98 | ; Enables copy/pasting GUIDs from C code 99 | macro EFI_GUID? data& 100 | match { d1 =, d2 =, d3 =, { d4_1 =, d4_2 =, d4_3 =, d4_4 =, d4_5 =, d4_6 =, d4_7 =, d4_8 } }, data 101 | dd d1 102 | dw d2 103 | dw d3 104 | db d4_1 105 | db d4_2 106 | db d4_3 107 | db d4_4 108 | db d4_5 109 | db d4_6 110 | db d4_7 111 | db d4_8 112 | else 113 | err 'invalid GUID syntax' 114 | end match 115 | end macro 116 | 117 | ; Data definitions, from UEFI specs 118 | 119 | ; EfiMain() is handled like any other EBC CALL routine, therefore 120 | ; we need to skip c=+16 bytes to access our parameters, due to the 121 | ; following stack manipulation operations having been carried out: 122 | ; R0 = R0 - 8 ; -> +8 123 | ; PUSH64 ReturnAddress ; -> +8 124 | ; Knowing this, the setup for the two EfiMain() parameters are 125 | ; 'ImageHandle' at (+0,+16) and 'SystemTable' at (+1,+16). 126 | struct EFI_MAIN_PARAMETERS 127 | Reserved rq 2 128 | ImageHandle EFI_HANDLE 129 | SystemTable VOID_PTR 130 | ends 131 | 132 | struct EFI_TABLE_HEADER 133 | Signature UINT64 134 | Revision UINT32 135 | HeaderSize UINT32 136 | CRC32 UINT32 137 | Reserved UINT32 138 | ends 139 | 140 | struct EFI_SYSTEM_TABLE 141 | Hdr EFI_TABLE_HEADER 142 | FirmwareVendor VOID_PTR 143 | FirmwareRevision UINT32 144 | ConsoleInHandle EFI_HANDLE 145 | ConIn VOID_PTR 146 | ConsoleOutHandle EFI_HANDLE 147 | ConOut VOID_PTR 148 | StandardErrorHandle EFI_HANDLE 149 | StdErr VOID_PTR 150 | RuntimeServices VOID_PTR 151 | BootServices VOID_PTR 152 | NumberOfTableEntries UINTN 153 | ConfigurationTable VOID_PTR 154 | ends 155 | 156 | struct EFI_RUNTIME_SERVICES 157 | Hdr EFI_TABLE_HEADER 158 | GetTime VOID_PTR 159 | SetTime VOID_PTR 160 | GetWakeupTime VOID_PTR 161 | SetWakeupTime VOID_PTR 162 | SetVirtualAddressMap VOID_PTR 163 | ConvertPointer VOID_PTR 164 | GetVariable VOID_PTR 165 | GetNextVariableName VOID_PTR 166 | SetVariable VOID_PTR 167 | GetNextHighMonotonicCount VOID_PTR 168 | ResetSystem VOID_PTR 169 | UpdateCapsule VOID_PTR 170 | QueryCapsuleCapabilities VOID_PTR 171 | QueryVariableInfo VOID_PTR 172 | ends 173 | 174 | struct SIMPLE_TEXT_OUTPUT_INTERFACE 175 | Reset VOID_PTR 176 | OutputString VOID_PTR 177 | TestString VOID_PTR 178 | QueryMode VOID_PTR 179 | SetMode VOID_PTR 180 | SetAttribute VOID_PTR 181 | ClearScreen VOID_PTR 182 | SetCursorPosition VOID_PTR 183 | EnableCursor VOID_PTR 184 | Mode VOID_PTR 185 | ends 186 | 187 | struct SIMPLE_TEXT_INPUT_INTERFACE 188 | Reset VOID_PTR 189 | ReadKeyStroke VOID_PTR 190 | WaitForKey VOID_PTR 191 | ends 192 | 193 | struct EFI_BOOT_SERVICES 194 | Hdr EFI_TABLE_HEADER 195 | RaiseTPL VOID_PTR 196 | RestoreTPL VOID_PTR 197 | AllocatePages VOID_PTR 198 | FreePages VOID_PTR 199 | GetMemoryMap VOID_PTR 200 | AllocatePool VOID_PTR 201 | FreePool VOID_PTR 202 | CreateEvent VOID_PTR 203 | SetTimer VOID_PTR 204 | WaitForEvent VOID_PTR 205 | SignalEvent VOID_PTR 206 | CloseEvent VOID_PTR 207 | CheckEvent VOID_PTR 208 | InstallProtocolInterface VOID_PTR 209 | ReinstallProtocolInterface VOID_PTR 210 | UninstallProtocolInterface VOID_PTR 211 | HandleProtocol VOID_PTR 212 | PCHandleProtocol VOID_PTR 213 | RegisterProtocolNotify VOID_PTR 214 | LocateHandle VOID_PTR 215 | LocateDevicePath VOID_PTR 216 | InstallConfigurationTable VOID_PTR 217 | LoadImage VOID_PTR 218 | StartImage VOID_PTR 219 | Exit VOID_PTR 220 | UnloadImage VOID_PTR 221 | ExitBootServices VOID_PTR 222 | GetNextMonotonicCount VOID_PTR 223 | Stall VOID_PTR 224 | SetWatchdogTimer VOID_PTR 225 | ConnectController VOID_PTR 226 | DisconnectController VOID_PTR 227 | OpenProtocol VOID_PTR 228 | CloseProtocol VOID_PTR 229 | OpenProtocolInformation VOID_PTR 230 | ProtocolsPerHandle VOID_PTR 231 | LocateHandleBuffer VOID_PTR 232 | LocateProtocol VOID_PTR 233 | InstallMultipleProtocolInterfaces VOID_PTR 234 | UninstallMultipleProtocolInterfaces VOID_PTR 235 | CalculateCrc32 VOID_PTR 236 | CopyMem VOID_PTR 237 | SetMem VOID_PTR 238 | CreateEventEx VOID_PTR 239 | ends 240 | 241 | struct EFI_OPEN_PROTOCOL 242 | Revision UINT32 243 | ParentHandle EFI_HANDLE 244 | SystemTable VOID_PTR 245 | DeviceHandle EFI_HANDLE 246 | FilePath VOID_PTR 247 | Reserved VOID_PTR 248 | LoadOptionsSize UINT32 249 | LoadOptions VOID_PTR 250 | ImageBase VOID_PTR 251 | ImageSize UINT64 252 | ImageCodeType INTN 253 | ImageDataType INTN 254 | Unload VOID_PTR 255 | ends 256 | 257 | ; Symbols 258 | 259 | FALSE = 0 260 | TRUE = 1 261 | 262 | EFI_SUCCESS = 0x0000000000000000 263 | EFI_ERROR = 0x8000000000000000 264 | EFI_32BIT_ERROR = 0x80000000 265 | EFI_32BIT_MASK = 0xFFFFFFFF 266 | EFI_LOAD_ERROR = EFI_ERROR or 0x01 267 | EFI_INVALID_PARAMETER = EFI_ERROR or 0x02 268 | EFI_UNSUPPORTED = EFI_ERROR or 0x03 269 | EFI_BAD_BUFFER_SIZE = EFI_ERROR or 0x04 270 | EFI_BUFFER_TOO_SMALL = EFI_ERROR or 0x05 271 | EFI_NOT_READY = EFI_ERROR or 0x06 272 | EFI_DEVICE_ERROR = EFI_ERROR or 0x07 273 | EFI_WRITE_PROTECTED = EFI_ERROR or 0x08 274 | EFI_OUT_OF_RESOURCES = EFI_ERROR or 0x09 275 | EFI_VOLUME_CORRUPTED = EFI_ERROR or 0x0A 276 | EFI_VOLUME_FULL = EFI_ERROR or 0x0B 277 | EFI_NO_MEDIA = EFI_ERROR or 0x0C 278 | EFI_MEDIA_CHANGED = EFI_ERROR or 0x0D 279 | EFI_NOT_FOUND = EFI_ERROR or 0x0E 280 | EFI_ACCESS_DENIED = EFI_ERROR or 0x0F 281 | EFI_NO_RESPONSE = EFI_ERROR or 0x10 282 | EFI_NO_MAPPING = EFI_ERROR or 0x11 283 | EFI_TIMEOUT = EFI_ERROR or 0x12 284 | EFI_NOT_STARTED = EFI_ERROR or 0x13 285 | EFI_ALREADY_STARTED = EFI_ERROR or 0x14 286 | EFI_ABORTED = EFI_ERROR or 0x15 287 | EFI_ICMP_ERROR = EFI_ERROR or 0x16 288 | EFI_TFTP_ERROR = EFI_ERROR or 0x17 289 | EFI_PROTOCOL_ERROR = EFI_ERROR or 0x18 290 | 291 | EfiResetCold = 0 292 | EfiResetWarm = 1 293 | EfiResetShutdown = 2 294 | 295 | EfiReservedMemoryType = 0 296 | EfiLoaderCode = 1 297 | EfiLoaderData = 2 298 | EfiBootServicesCode = 3 299 | EfiBootServicesData = 4 300 | EfiRuntimeServicesCode = 5 301 | EfiRuntimeServicesData = 6 302 | EfiConventionalMemory = 7 303 | EfiUnusableMemory = 8 304 | EfiACPIReclaimMemory = 9 305 | EfiACPIMemoryNVS = 10 306 | EfiMemoryMappedIO = 11 307 | EfiMemoryMappedIOPortSpace = 12 308 | EfiPalCode = 13 309 | EfiMaxMemoryType = 14 310 | 311 | EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL = 0x00000001 312 | EFI_OPEN_PROTOCOL_GET_PROTOCOL = 0x00000002 313 | EFI_OPEN_PROTOCOL_TEST_PROTOCOL = 0x00000004 314 | EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER = 0x00000008 315 | EFI_OPEN_PROTOCOL_BY_DRIVER = 0x00000010 316 | EFI_OPEN_PROTOCOL_EXCLUSIVE = 0x00000020 317 | 318 | AllHandles = 0 319 | ByRegisterNotify = 1 320 | ByProtocol = 2 -------------------------------------------------------------------------------- /include/format.inc: -------------------------------------------------------------------------------- 1 | 2 | macro format? clause 3 | match =MZ?, clause 4 | include 'format/mz.inc' 5 | else match =PE? settings, clause: 6 | PE.Settings.Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE or IMAGE_FILE_32BIT_MACHINE 7 | PE.Settings.DllCharacteristics = 0 8 | local seq 9 | define seq settings 10 | while 1 11 | match :, seq 12 | break 13 | else match =DLL? more, seq 14 | PE.Settings.Characteristics = PE.Settings.Characteristics or IMAGE_FILE_DLL 15 | redefine seq more 16 | else match =large? more, seq 17 | PE.Settings.Characteristics = PE.Settings.Characteristics or IMAGE_FILE_LARGE_ADDRESS_AWARE 18 | redefine seq more 19 | else match =WDM? more, seq 20 | PE.Settings.DllCharacteristics = PE.Settings.DllCharacteristics or IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER 21 | redefine seq more 22 | else match =NX? more, seq 23 | PE.Settings.DllCharacteristics = PE.Settings.DllCharacteristics or IMAGE_DLL_CHARACTERISTICS_NX_COMPAT 24 | redefine seq more 25 | else match =at? base =on? stub :, seq 26 | PE.Settings.ImageBase = base 27 | PE.Settings.Stub = stub 28 | break 29 | else match =at? base :, seq 30 | PE.Settings.ImageBase = base 31 | break 32 | else match =on? stub :, seq 33 | PE.Settings.Stub = stub 34 | break 35 | else 36 | match =GUI? more, seq 37 | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI 38 | redefine seq more 39 | else match =console? more, seq 40 | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI 41 | redefine seq more 42 | else match =native? more, seq 43 | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_NATIVE 44 | PE.Settings.SectionAlignment = 32 45 | PE.Settings.FileAlignment = 32 46 | PE.Settings.ComputeCheckSum = 1 47 | redefine seq more 48 | else match =EFI? more, seq 49 | PE.Settings.Magic = 0x20B 50 | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION 51 | redefine seq more 52 | else match =EFIboot? more, seq 53 | PE.Settings.Magic = 0x20B 54 | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 55 | redefine seq more 56 | else match =EFIruntime? more, seq 57 | PE.Settings.Magic = 0x20B 58 | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 59 | redefine seq more 60 | else 61 | err 'invalid argument' 62 | break 63 | end match 64 | match V.v more, seq 65 | PE.Settings.MajorSubsystemVersion = V 66 | PE.Settings.MinorSubsystemVersion = v 67 | redefine seq more 68 | end match 69 | end match 70 | end while 71 | include 'format/pe.inc' 72 | use32 73 | else match =PE64? settings, clause: 74 | PE.Settings.Magic = 0x20B 75 | PE.Settings.Machine = IMAGE_FILE_MACHINE_AMD64 76 | PE.Settings.Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE or IMAGE_FILE_32BIT_MACHINE 77 | PE.Settings.DllCharacteristics = 0 78 | PE.Settings.MajorSubsystemVersion = 5 79 | PE.Settings.MinorSubsystemVersion = 0 80 | local seq 81 | define seq settings 82 | while 1 83 | match :, seq 84 | break 85 | else match =DLL? more, seq 86 | PE.Settings.Characteristics = PE.Settings.Characteristics or IMAGE_FILE_DLL 87 | redefine seq more 88 | else match =large? more, seq 89 | PE.Settings.Characteristics = PE.Settings.Characteristics or IMAGE_FILE_LARGE_ADDRESS_AWARE 90 | redefine seq more 91 | else match =WDM? more, seq 92 | PE.Settings.DllCharacteristics = PE.Settings.DllCharacteristics or IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER 93 | redefine seq more 94 | else match =NX? more, seq 95 | PE.Settings.DllCharacteristics = PE.Settings.DllCharacteristics or IMAGE_DLL_CHARACTERISTICS_NX_COMPAT 96 | redefine seq more 97 | else match =at? base =on? stub :, seq 98 | PE.Settings.ImageBase = base 99 | PE.Settings.Stub = stub 100 | break 101 | else match =at? base :, seq 102 | PE.Settings.ImageBase = base 103 | break 104 | else match =on? stub :, seq 105 | PE.Settings.Stub = stub 106 | break 107 | else 108 | match =GUI? more, seq 109 | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI 110 | redefine seq more 111 | else match =console? more, seq 112 | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI 113 | redefine seq more 114 | else match =native? more, seq 115 | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_NATIVE 116 | PE.Settings.SectionAlignment = 32 117 | PE.Settings.FileAlignment = 32 118 | PE.Settings.ComputeCheckSum = 1 119 | redefine seq more 120 | else match =EFI? more, seq 121 | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION 122 | redefine seq more 123 | else match =EFIboot? more, seq 124 | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 125 | redefine seq more 126 | else match =EFIruntime? more, seq 127 | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 128 | redefine seq more 129 | else 130 | err 'invalid argument' 131 | break 132 | end match 133 | match V.v more, seq 134 | PE.Settings.MajorSubsystemVersion = V 135 | PE.Settings.MinorSubsystemVersion = v 136 | redefine seq more 137 | end match 138 | end match 139 | end while 140 | include 'format/pe.inc' 141 | use64 142 | else match =PEEBC? settings, clause: 143 | PE.Settings.Magic = 0x20B 144 | PE.Settings.Machine = IMAGE_FILE_MACHINE_EBC 145 | PE.Settings.Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE or IMAGE_FILE_32BIT_MACHINE or IMAGE_FILE_DLL 146 | PE.Settings.MajorSubsystemVersion = 5 147 | PE.Settings.MinorSubsystemVersion = 0 148 | PE.Settings.Stub = "stub.com" 149 | define seq settings 150 | while 1 151 | match :, seq 152 | break 153 | else match =EFI? more, seq 154 | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION 155 | redefine seq more 156 | else match =EFIboot? more, seq 157 | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 158 | redefine seq more 159 | else match =EFIruntime? more, seq 160 | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 161 | redefine seq more 162 | else 163 | err 'invalid argument' 164 | break 165 | end match 166 | match V.v more, seq 167 | PE.Settings.MajorSubsystemVersion = V 168 | PE.Settings.MinorSubsystemVersion = v 169 | redefine seq more 170 | end match 171 | end while 172 | include 'pe.inc' 173 | else match =ELF? =executable? settings, clause: 174 | match brand =at? base:, settings 175 | ELF.Settings.ABI = brand 176 | ELF.Settings.BaseAddress = base 177 | else match =at? base:, settings 178 | ELF.Settings.BaseAddress = base 179 | else match brand:, settings 180 | ELF.Settings.ABI = brand 181 | end match 182 | include 'format/elfexe.inc' 183 | use32 184 | else match =ELF64? =executable? settings, clause: 185 | ELF.Settings.Class = ELFCLASS64 186 | ELF.Settings.Machine = EM_X86_64 187 | ELF.Settings.BaseAddress = 400000h 188 | match brand =at? base:, settings 189 | ELF.Settings.ABI = brand 190 | ELF.Settings.BaseAddress = base 191 | else match =at? base:, settings 192 | ELF.Settings.BaseAddress = base 193 | else match brand:, settings 194 | ELF.Settings.ABI = brand 195 | end match 196 | include 'format/elfexe.inc' 197 | use64 198 | else match =ELF?, clause 199 | include 'format/elf32.inc' 200 | use32 201 | else match =ELF64?, clause 202 | include 'format/elf64.inc' 203 | use64 204 | else 205 | err 'invalid argument' 206 | end match 207 | end macro 208 | -------------------------------------------------------------------------------- /include/pe.inc: -------------------------------------------------------------------------------- 1 | 2 | IMAGE_FILE_MACHINE_UNKNOWN = 0x0 3 | IMAGE_FILE_MACHINE_AM33 = 0x1D3 4 | IMAGE_FILE_MACHINE_AMD64 = 0x8664 5 | IMAGE_FILE_MACHINE_ARM = 0x1C0 6 | IMAGE_FILE_MACHINE_ARMNT = 0x1C4 7 | IMAGE_FILE_MACHINE_ARM64 = 0xAA64 8 | IMAGE_FILE_MACHINE_EBC = 0xEBC 9 | IMAGE_FILE_MACHINE_I386 = 0x14C 10 | IMAGE_FILE_MACHINE_IA64 = 0x200 11 | IMAGE_FILE_MACHINE_M32R = 0x9041 12 | IMAGE_FILE_MACHINE_MIPS16 = 0x266 13 | IMAGE_FILE_MACHINE_MIPSFPU = 0x366 14 | IMAGE_FILE_MACHINE_MIPSFPU16 = 0x466 15 | IMAGE_FILE_MACHINE_POWERPC = 0x1F0 16 | IMAGE_FILE_MACHINE_POWERPCFP = 0x1F1 17 | IMAGE_FILE_MACHINE_R4000 = 0x166 18 | IMAGE_FILE_MACHINE_SH3 = 0x1A2 19 | IMAGE_FILE_MACHINE_SH3DSP = 0x1A3 20 | IMAGE_FILE_MACHINE_SH4 = 0x1A6 21 | IMAGE_FILE_MACHINE_SH5 = 0x1A8 22 | IMAGE_FILE_MACHINE_THUMB = 0x1C2 23 | IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169 24 | 25 | IMAGE_FILE_RELOCS_STRIPPED = 0x0001 26 | IMAGE_FILE_EXECUTABLE_IMAGE = 0x0002 27 | IMAGE_FILE_LINE_NUMS_STRIPPED = 0x0004 28 | IMAGE_FILE_LOCAL_SYMS_STRIPPED = 0x0008 29 | IMAGE_FILE_AGGRESSIVE_WS_TRIM = 0x0010 30 | IMAGE_FILE_LARGE_ADDRESS_AWARE = 0x0020 31 | IMAGE_FILE_BYTES_REVERSED_LO = 0x0080 32 | IMAGE_FILE_32BIT_MACHINE = 0x0100 33 | IMAGE_FILE_DEBUG_STRIPPED = 0x0200 34 | IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400 35 | IMAGE_FILE_NET_RUN_FROM_SWAP = 0x0800 36 | IMAGE_FILE_SYSTEM = 0x1000 37 | IMAGE_FILE_DLL = 0x2000 38 | IMAGE_FILE_UP_SYSTEM_ONLY = 0x4000 39 | IMAGE_FILE_BYTES_REVERSED_HI = 0x8000 40 | 41 | IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE = 0x0040 42 | IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY = 0x0080 43 | IMAGE_DLL_CHARACTERISTICS_NX_COMPAT = 0x0100 44 | IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION = 0x0200 45 | IMAGE_DLL_CHARACTERISTICS_NO_SEH = 0x0400 46 | IMAGE_DLL_CHARACTERISTICS_NO_BIND = 0x0800 47 | IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER = 0x2000 48 | IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000 49 | 50 | IMAGE_SUBSYSTEM_UNKNOWN = 0 51 | IMAGE_SUBSYSTEM_NATIVE = 1 52 | IMAGE_SUBSYSTEM_WINDOWS_GUI = 2 53 | IMAGE_SUBSYSTEM_WINDOWS_CUI = 3 54 | IMAGE_SUBSYSTEM_POSIX_CUI = 7 55 | IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9 56 | IMAGE_SUBSYSTEM_EFI_APPLICATION = 10 57 | IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11 58 | IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12 59 | IMAGE_SUBSYSTEM_EFI_ROM = 13 60 | IMAGE_SUBSYSTEM_XBOX = 14 61 | 62 | IMAGE_SCN_TYPE_NO_PAD = 0x00000008 63 | IMAGE_SCN_CNT_CODE = 0x00000020 64 | IMAGE_SCN_CNT_INITIALIZED_DATA = 0x00000040 65 | IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080 66 | IMAGE_SCN_LNK_OTHER = 0x00000100 67 | IMAGE_SCN_LNK_INFO = 0x00000200 68 | IMAGE_SCN_LNK_REMOVE = 0x00000800 69 | IMAGE_SCN_LNK_COMDAT = 0x00001000 70 | IMAGE_SCN_GPREL = 0x00008000 71 | IMAGE_SCN_MEM_PURGEABLE = 0x00020000 72 | IMAGE_SCN_MEM_16BIT = 0x00020000 73 | IMAGE_SCN_MEM_LOCKED = 0x00040000 74 | IMAGE_SCN_MEM_PRELOAD = 0x00080000 75 | IMAGE_SCN_ALIGN_1BYTES = 0x00100000 76 | IMAGE_SCN_ALIGN_2BYTES = 0x00200000 77 | IMAGE_SCN_ALIGN_4BYTES = 0x00300000 78 | IMAGE_SCN_ALIGN_8BYTES = 0x00400000 79 | IMAGE_SCN_ALIGN_16BYTES = 0x00500000 80 | IMAGE_SCN_ALIGN_32BYTES = 0x00600000 81 | IMAGE_SCN_ALIGN_64BYTES = 0x00700000 82 | IMAGE_SCN_ALIGN_128BYTES = 0x00800000 83 | IMAGE_SCN_ALIGN_256BYTES = 0x00900000 84 | IMAGE_SCN_ALIGN_512BYTES = 0x00A00000 85 | IMAGE_SCN_ALIGN_1024BYTES = 0x00B00000 86 | IMAGE_SCN_ALIGN_2048BYTES = 0x00C00000 87 | IMAGE_SCN_ALIGN_4096BYTES = 0x00D00000 88 | IMAGE_SCN_ALIGN_8192BYTES = 0x00E00000 89 | IMAGE_SCN_LNK_NRELOC_OVFL = 0x01000000 90 | IMAGE_SCN_MEM_DISCARDABLE = 0x02000000 91 | IMAGE_SCN_MEM_NOT_CACHED = 0x04000000 92 | IMAGE_SCN_MEM_NOT_PAGED = 0x08000000 93 | IMAGE_SCN_MEM_SHARED = 0x10000000 94 | IMAGE_SCN_MEM_EXECUTE = 0x20000000 95 | IMAGE_SCN_MEM_READ = 0x40000000 96 | IMAGE_SCN_MEM_WRITE = 0x80000000 97 | 98 | IMAGE_REL_BASED_ABSOLUTE = 0 99 | IMAGE_REL_BASED_HIGH = 1 100 | IMAGE_REL_BASED_LOW = 2 101 | IMAGE_REL_BASED_HIGHLOW = 3 102 | IMAGE_REL_BASED_HIGHADJ = 4 103 | IMAGE_REL_BASED_DIR64 = 10 104 | 105 | macro align? boundary,value:? 106 | if $ relativeto 0 | ( $ relativeto PE.RELOCATION & PE.SECTION_ALIGNMENT mod boundary = 0 ) 107 | db (boundary-1)-(($ scale 0)+boundary-1) mod boundary dup value 108 | else 109 | err 'section not aligned enough' 110 | end if 111 | end macro 112 | 113 | PE:: 114 | 115 | namespace PE 116 | 117 | if defined Settings.Magic 118 | MAGIC = Settings.Magic 119 | else 120 | MAGIC = 0x10B 121 | end if 122 | 123 | if defined Settings.Machine 124 | MACHINE = Settings.Machine 125 | else 126 | MACHINE = IMAGE_FILE_MACHINE_I386 127 | end if 128 | 129 | if defined Settings.Characteristics 130 | CHARACTERISTICS = Settings.Characteristics 131 | else 132 | CHARACTERISTICS = IMAGE_FILE_EXECUTABLE_IMAGE or IMAGE_FILE_32BIT_MACHINE 133 | end if 134 | 135 | if defined Settings.DllCharacteristics 136 | DLL_CHARACTERISTICS = Settings.DllCharacteristics 137 | else 138 | DLL_CHARACTERISTICS = 0 139 | end if 140 | 141 | if defined Settings.Subsystem 142 | SUBSYSTEM = Settings.Subsystem 143 | else 144 | SUBSYSTEM = IMAGE_SUBSYSTEM_WINDOWS_CUI 145 | end if 146 | 147 | if defined Settings.MajorSubsystemVersion 148 | MAJOR_SUBSYSTEM_VERSION = Settings.MajorSubsystemVersion 149 | else 150 | MAJOR_SUBSYSTEM_VERSION = 3 151 | end if 152 | 153 | if defined Settings.MinorSubsystemVersion 154 | MINOR_SUBSYSTEM_VERSION = Settings.MinorSubsystemVersion 155 | else 156 | MINOR_SUBSYSTEM_VERSION = 10 157 | end if 158 | 159 | if defined Fixups | MACHINE = IMAGE_FILE_MACHINE_EBC 160 | element RELOCATION 161 | else 162 | RELOCATION := 0 163 | CHARACTERISTICS = CHARACTERISTICS or IMAGE_FILE_RELOCS_STRIPPED 164 | end if 165 | 166 | if defined Settings.ImageBase 167 | IMAGE_BASE := RELOCATION + Settings.ImageBase 168 | else 169 | IMAGE_BASE := RELOCATION + 400000h 170 | end if 171 | 172 | if defined Settings.SectionAlignment 173 | SECTION_ALIGNMENT := Settings.SectionAlignment 174 | else 175 | SECTION_ALIGNMENT := 1000h 176 | end if 177 | 178 | if defined Settings.FileAlignment 179 | FILE_ALIGNMENT := Settings.FileAlignment 180 | else 181 | FILE_ALIGNMENT := 512 182 | end if 183 | 184 | NUMBER_OF_DIRECTORIES := 16 185 | 186 | if defined Settings.Stub 187 | 188 | virtual at 0 189 | file Settings.Stub 190 | if $ >= 1Ch 191 | load SIGNATURE : word from 0 192 | if SIGNATURE = "MZ" | SIGNATURE = "ZM" 193 | StubTemplate:: 194 | end if 195 | end if 196 | end virtual 197 | 198 | if defined StubTemplate 199 | 200 | load .BYTES_IN_LAST_PAGE : word from StubTemplate:2 201 | load .NUMBER_OF_PAGES : word from StubTemplate:4 202 | .TEMPLATE_LENGTH = (.NUMBER_OF_PAGES-1) shl 9 + .BYTES_IN_LAST_PAGE 203 | 204 | load .RELOCATIONS_OFFSET : word from StubTemplate:18h 205 | if .RELOCATIONS_OFFSET >= 40h 206 | file Settings.Stub,.TEMPLATE_LENGTH 207 | else 208 | load .NUMBER_OF_RELOCATIONS : word from StubTemplate:6 209 | .RELOCATIONS_LENGTH = .NUMBER_OF_RELOCATIONS shl 2 210 | load .NUMBER_OF_HEADER_PARAGRAPHS : word from StubTemplate:8 211 | .TEMPLATE_HEADER_LENGTH = .NUMBER_OF_HEADER_PARAGRAPHS shl 4 212 | 213 | file Settings.Stub,1Ch 214 | rb 40h - $ 215 | file Settings.Stub:.RELOCATIONS_OFFSET,.RELOCATIONS_LENGTH 216 | align 16 217 | .HEADER_LENGTH = $ 218 | file Settings.Stub:.TEMPLATE_HEADER_LENGTH,.TEMPLATE_LENGTH-.TEMPLATE_HEADER_LENGTH 219 | .LENGTH = $ 220 | 221 | store 40h : word at 18h 222 | store .HEADER_LENGTH shr 4 : word at 8 223 | store .LENGTH and 1FFh : word at 2 224 | store (.LENGTH-1) shr 9 + 1 : word at 4 225 | end if 226 | 227 | store Header : dword at 3Ch 228 | 229 | else 230 | 231 | Stub: 232 | .signature dw "MZ" 233 | .bytes_in_last_page dw .LENGTH and 1FFh 234 | .number_of_pages dw (.LENGTH-1) shr 9 + 1 235 | .number_of_relocations dw 0 236 | .number_of_header_paragraphs dw .HEADER_LENGTH shr 4 237 | .minimum_heap dw (10000h - (.LENGTH-.HEADER_LENGTH)) shr 4 238 | .maximum_heap dw 0FFFFh 239 | .initial_ss dw (-100h) shr 4 240 | .initial_sp dw 0FFFEh 241 | .checksum dw 0 242 | .initial_ip dw 100h 243 | .initial_cs dw (-100h) shr 4 244 | .relocations_offset dw 40h 245 | .overlay_number dw 0 246 | rb 3Ch - $ 247 | .new_header_offset dd Header 248 | 249 | .HEADER_LENGTH = $ 250 | 251 | file Settings.Stub 252 | 253 | .LENGTH = $ 254 | 255 | end if 256 | 257 | else 258 | 259 | Stub: 260 | .signature dw "MZ" 261 | .bytes_in_last_page dw .LENGTH and 1FFh 262 | .number_of_pages dw (.LENGTH-1) shr 9 + 1 263 | .number_of_relocations dw 0 264 | .number_of_header_paragraphs dw .HEADER_LENGTH shr 4 265 | .minimum_heap dw .STACK_LENGTH shr 4 266 | .maximum_heap dw 0FFFFh 267 | .initial_ss dw 0 268 | .initial_sp dw .LENGTH - .HEADER_LENGTH + .STACK_LENGTH 269 | .checksum dw 0 270 | .initial_ip dw 0 271 | .initial_cs dw 0 272 | .relocations_offset dw 40h 273 | .overlay_number dw 0 274 | rb 3Ch - $ 275 | .new_header_offset dd Header 276 | 277 | .HEADER_LENGTH = $ 278 | .STACK_LENGTH = 100h 279 | 280 | namespace Stub 281 | 282 | include '../8086.inc' 283 | 284 | start: 285 | push cs 286 | pop ds 287 | mov dx,message - start 288 | mov ah,9 289 | int 21h 290 | mov ax,4C01h 291 | int 21h 292 | 293 | message db 'This program cannot be run in DOS mode.',0Dh,0Ah,24h 294 | 295 | end namespace 296 | 297 | align 16 298 | 299 | .LENGTH = $ 300 | 301 | end if 302 | 303 | align 8 304 | 305 | Header: 306 | .Signature dw "PE",0 307 | .Machine dw MACHINE 308 | .NumberOfSections dw NUMBER_OF_SECTIONS 309 | .TimeDateStamp dd %t 310 | .PointerToSymbolTable dd 0 311 | .NumberOfSymbols dd 0 312 | .SizeOfOptionalHeader dw SectionTable - OptionalHeader 313 | .Characteristics dw CHARACTERISTICS 314 | 315 | OptionalHeader: 316 | .Magic dw MAGIC 317 | .MajorLinkerVersion db 2 318 | .MinorLinkerVersion db 0 319 | .SizeOfCode dd 0 320 | .SizeOfInitializedData dd 0 321 | .SizeOfUninitializedData dd 0 322 | .AddressOfEntryPoint dd 0 323 | .BaseOfCode dd 0 324 | if MAGIC <> 0x20B 325 | .BaseOfData dd 0 326 | .ImageBase dd IMAGE_BASE - RELOCATION 327 | else 328 | .ImageBase dq IMAGE_BASE - RELOCATION 329 | end if 330 | .SectionAlignment dd SECTION_ALIGNMENT 331 | .FileAlignment dd FILE_ALIGNMENT 332 | .MajorOperatingSystemVersion dw 1 333 | .MinorOperatingSystemVersion dw 0 334 | .MajorImageVersion dw 0 335 | .MinorImageVersion dw 0 336 | .MajorSubsystemVersion dw MAJOR_SUBSYSTEM_VERSION 337 | .MinorSubsystemVersion dw MINOR_SUBSYSTEM_VERSION 338 | .Win32VersionValue dd 0 339 | .SizeOfImage dd SIZE_OF_IMAGE 340 | .SizeOfHeaders dd SIZE_OF_HEADERS 341 | .CheckSum dd 0 342 | .Subsystem dw SUBSYSTEM 343 | .DllCharacteristics dw DLL_CHARACTERISTICS 344 | if MAGIC <> 0x20B 345 | .SizeOfStackReserve dd 1000h 346 | .SizeOfStackCommit dd 1000h 347 | .SizeOfHeapReserve dd 10000h 348 | .SizeOfHeapCommit dd 0 349 | else 350 | .SizeOfStackReserve dq 1000h 351 | .SizeOfStackCommit dq 1000h 352 | .SizeOfHeapReserve dq 10000h 353 | .SizeOfHeapCommit dq 0 354 | end if 355 | .LoaderFlags dd 0 356 | .NumberOfRvaAndSizes dd NUMBER_OF_DIRECTORIES 357 | RvaAndSizes: 358 | .Rva dd 0 359 | .Size dd 0 360 | .ENTRY_LENGTH = $ - RvaAndSizes 361 | db (NUMBER_OF_DIRECTORIES-1)*RvaAndSizes.ENTRY_LENGTH dup 0 362 | SectionTable: 363 | .Name dq '.flat' 364 | .VirtualSize dd 0 365 | .VirtualAddress dd 0 366 | .SizeOfRawData dd 0 367 | .PointerToRawData dd 0 368 | .PointerToRelocations dd 0 369 | .PointerToLineNumbers dd 0 370 | .NumberOfRelocations dw 0 371 | .NumberOfLineNumbers dw 0 372 | .Characteristics dd IMAGE_SCN_MEM_EXECUTE + IMAGE_SCN_MEM_READ + IMAGE_SCN_MEM_WRITE 373 | .ENTRY_LENGTH = $ - SectionTable 374 | db (NUMBER_OF_SECTIONS-1)*SectionTable.ENTRY_LENGTH dup 0 375 | 376 | HeadersEnd: 377 | define CheckSumBlocks PE,0,HeadersEnd 378 | 379 | SECTION_INDEX = 0 380 | RELOCATION_INDEX = 0 381 | DEFINED_SECTION = 0 382 | SECTION_DIRECTORIES = 0 383 | align SECTION_ALIGNMENT 384 | FIRST_SECTION_RVA: 385 | section $%% 386 | align FILE_ALIGNMENT,0 387 | SIZE_OF_HEADERS = $% 388 | FILE_OFFSET = $% 389 | SECTION_BASE = IMAGE_BASE + FIRST_SECTION_RVA 390 | org SECTION_BASE 391 | 392 | store SECTION_BASE-IMAGE_BASE at PE:OptionalHeader.AddressOfEntryPoint 393 | store SECTION_BASE-IMAGE_BASE at PE:SectionTable.VirtualAddress 394 | store FILE_OFFSET at PE:SectionTable.PointerToRawData 395 | 396 | virtual at 0 397 | relocated_addresses:: rd NUMBER_OF_RELOCATIONS 398 | end virtual 399 | 400 | virtual at 0 401 | relocation_types:: rw NUMBER_OF_RELOCATIONS 402 | end virtual 403 | 404 | end namespace 405 | 406 | RVA? equ -PE.IMAGE_BASE + 407 | 408 | macro entry? address* 409 | namespace PE 410 | store address-IMAGE_BASE at PE:OptionalHeader.AddressOfEntryPoint 411 | end namespace 412 | end macro 413 | 414 | macro stack? reserve*,commit:1000h 415 | namespace PE 416 | store reserve at PE:OptionalHeader.SizeOfStackReserve 417 | store commit at PE:OptionalHeader.SizeOfStackCommit 418 | end namespace 419 | end macro 420 | 421 | macro heap? reserve*,commit:0 422 | namespace PE 423 | store reserve at PE:OptionalHeader.SizeOfHeapReserve 424 | store commit at PE:OptionalHeader.SizeOfHeapCommit 425 | end namespace 426 | end macro 427 | 428 | macro section? 429 | namespace PE 430 | 431 | repeat SECTION_DIRECTORIES 432 | end data 433 | end repeat 434 | 435 | local AREA,DATA_START,DATA_END 436 | AREA:: 437 | DATA_START = $$ 438 | DATA_END = $-($%-$%%) 439 | CheckSumBlocks equ CheckSumBlocks,AREA,DATA_START,DATA_END 440 | 441 | SECTION_SIZE = $ - SECTION_BASE 442 | store SECTION_SIZE at PE:SectionTable.VirtualSize+SECTION_INDEX*SectionTable.ENTRY_LENGTH 443 | align SECTION_ALIGNMENT 444 | SECTION_BASE = $ 445 | section $%% 446 | align FILE_ALIGNMENT,0 447 | RAW_DATA_SIZE = $% - FILE_OFFSET 448 | store RAW_DATA_SIZE at PE:SectionTable.SizeOfRawData+SECTION_INDEX*SectionTable.ENTRY_LENGTH 449 | FILE_OFFSET = $% 450 | org SECTION_BASE 451 | 452 | if SECTION_SIZE > 0 & RAW_DATA_SIZE = 0 453 | load SECTION_CHARACTERISTICS from PE:SectionTable.Characteristics+SECTION_INDEX*SectionTable.ENTRY_LENGTH 454 | SECTION_CHARACTERISTICS = SECTION_CHARACTERISTICS or IMAGE_SCN_CNT_UNINITIALIZED_DATA 455 | store SECTION_CHARACTERISTICS at PE:SectionTable.Characteristics+SECTION_INDEX*SectionTable.ENTRY_LENGTH 456 | end if 457 | 458 | if DEFINED_SECTION | SECTION_SIZE > 0 459 | SECTION_INDEX = SECTION_INDEX + 1 460 | end if 461 | 462 | end namespace 463 | end macro 464 | 465 | macro section? declaration* 466 | namespace PE 467 | 468 | section 469 | 470 | DEFINED_SECTION = 1 471 | 472 | store SECTION_BASE-IMAGE_BASE at PE:SectionTable.VirtualAddress+SECTION_INDEX*SectionTable.ENTRY_LENGTH 473 | store FILE_OFFSET at PE:SectionTable.PointerToRawData+SECTION_INDEX*SectionTable.ENTRY_LENGTH 474 | 475 | SECTION_DIRECTORIES = 0 476 | 477 | match name attributes, declaration 478 | 479 | store name:qword at PE:SectionTable.Name+SECTION_INDEX*SectionTable.ENTRY_LENGTH 480 | 481 | SECTION_CHARACTERISTICS = 0 482 | 483 | local seq,list 484 | define seq attributes 485 | while 1 486 | match car cdr, seq 487 | define list car 488 | define seq cdr 489 | else 490 | match any, seq 491 | define list any 492 | end match 493 | break 494 | end match 495 | end while 496 | irpv attribute, list 497 | match =readable?, attribute 498 | SECTION_CHARACTERISTICS = SECTION_CHARACTERISTICS or IMAGE_SCN_MEM_READ 499 | else match =writeable?, attribute 500 | SECTION_CHARACTERISTICS = SECTION_CHARACTERISTICS or IMAGE_SCN_MEM_WRITE 501 | else match =executable?, attribute 502 | SECTION_CHARACTERISTICS = SECTION_CHARACTERISTICS or IMAGE_SCN_MEM_EXECUTE 503 | else match =discardable?, attribute 504 | SECTION_CHARACTERISTICS = SECTION_CHARACTERISTICS or IMAGE_SCN_MEM_DISCARDABLE 505 | else match =shareable?, attribute 506 | SECTION_CHARACTERISTICS = SECTION_CHARACTERISTICS or IMAGE_SCN_MEM_SHARED 507 | else match =import?, attribute 508 | SECTION_DIRECTORIES = SECTION_DIRECTORIES + 1 509 | data import 510 | else match =export?, attribute 511 | SECTION_DIRECTORIES = SECTION_DIRECTORIES + 1 512 | data export 513 | else match =resource?, attribute 514 | SECTION_DIRECTORIES = SECTION_DIRECTORIES + 1 515 | data resource 516 | else match =fixups?, attribute 517 | SECTION_DIRECTORIES = SECTION_DIRECTORIES + 1 518 | data fixups 519 | else match =code?, attribute 520 | SECTION_CHARACTERISTICS = SECTION_CHARACTERISTICS or IMAGE_SCN_CNT_CODE 521 | else match =data?, attribute 522 | SECTION_CHARACTERISTICS = SECTION_CHARACTERISTICS or IMAGE_SCN_CNT_INITIALIZED_DATA 523 | else match =udata?, attribute 524 | SECTION_CHARACTERISTICS = SECTION_CHARACTERISTICS or IMAGE_SCN_CNT_UNINITIALIZED_DATA 525 | else 526 | err 'invalid argument' 527 | end match 528 | end irpv 529 | 530 | store SECTION_CHARACTERISTICS at PE:SectionTable.Characteristics+SECTION_INDEX*SectionTable.ENTRY_LENGTH 531 | else 532 | 533 | store declaration:qword at PE:SectionTable.Name+SECTION_INDEX*SectionTable.ENTRY_LENGTH 534 | 535 | end match 536 | 537 | end namespace 538 | end macro 539 | 540 | macro data? type* 541 | namespace PE 542 | local number 543 | match =export?, type 544 | number = 0 545 | else match =import?, type 546 | number = 1 547 | else match =resource?, type 548 | number = 2 549 | else match =fixups?, type 550 | number = 5 551 | else 552 | number = type 553 | end match 554 | define DATA_DIRECTORY number 555 | load DATA_BASE:dword from PE:RvaAndSizes.Rva+DATA_DIRECTORY*RvaAndSizes.ENTRY_LENGTH 556 | if DATA_BASE = 0 557 | store $-IMAGE_BASE:dword at PE:RvaAndSizes.Rva+DATA_DIRECTORY*RvaAndSizes.ENTRY_LENGTH 558 | if DATA_DIRECTORY = 5 559 | Fixups: 560 | PAGE_RVA = 0 561 | BLOCK_HEADER = 0 562 | BLOCK_SIZE = 0 563 | repeat NUMBER_OF_RELOCATIONS 564 | load ADDRESS:dword from relocated_addresses:(%-1) shl 2 565 | if ADDRESS and not 0FFFh <> PAGE_RVA 566 | if BLOCK_HEADER 567 | if BLOCK_SIZE and 11b 568 | dw 0 569 | BLOCK_SIZE = BLOCK_SIZE + 2 570 | end if 571 | store BLOCK_SIZE:dword at BLOCK_HEADER+4 572 | end if 573 | PAGE_RVA = ADDRESS and not 0FFFh 574 | BLOCK_HEADER = $ 575 | dd PAGE_RVA 576 | dd 0 577 | BLOCK_SIZE = 8 578 | end if 579 | load TYPE:word from relocation_types:(%-1) shl 1 580 | dw (ADDRESS and 0FFFh) or (TYPE shl 12) 581 | BLOCK_SIZE = BLOCK_SIZE + 2 582 | end repeat 583 | if BLOCK_HEADER 584 | if BLOCK_SIZE and 11b 585 | dw 0 586 | BLOCK_SIZE = BLOCK_SIZE + 2 587 | end if 588 | store BLOCK_SIZE:dword at BLOCK_HEADER+4 589 | end if 590 | end if 591 | else 592 | err 'data already defined' 593 | end if 594 | end namespace 595 | end macro 596 | 597 | macro end?.data? 598 | namespace PE 599 | load DATA_BASE:dword from PE:RvaAndSizes.Rva+DATA_DIRECTORY*RvaAndSizes.ENTRY_LENGTH 600 | store $-IMAGE_BASE-DATA_BASE:dword at PE:RvaAndSizes.Size+DATA_DIRECTORY*RvaAndSizes.ENTRY_LENGTH 601 | restore DATA_DIRECTORY 602 | end namespace 603 | end macro 604 | 605 | macro dword? value 606 | local v 607 | v = value 608 | if ~ v relativeto 0 & v relativeto PE.RELOCATION 609 | store $-PE.IMAGE_BASE:dword at PE.relocated_addresses:PE.RELOCATION_INDEX shl 2 610 | store IMAGE_REL_BASED_HIGHLOW:word at PE.relocation_types:PE.RELOCATION_INDEX shl 1 611 | dd v - PE.RELOCATION 612 | PE.RELOCATION_INDEX = PE.RELOCATION_INDEX + 1 613 | else 614 | dd v 615 | end if 616 | end macro 617 | 618 | macro qword? value 619 | local v 620 | v = value 621 | if ~ v relativeto 0 & v relativeto PE.RELOCATION 622 | store $-PE.IMAGE_BASE:dword at PE.relocated_addresses:PE.RELOCATION_INDEX shl 2 623 | store IMAGE_REL_BASED_DIR64:word at PE.relocation_types:PE.RELOCATION_INDEX shl 1 624 | dq v - PE.RELOCATION 625 | PE.RELOCATION_INDEX = PE.RELOCATION_INDEX + 1 626 | else 627 | dq v 628 | end if 629 | end macro 630 | 631 | macro dd? definitions& 632 | iterate value,definitions 633 | match ?, value 634 | dd ? 635 | else match n =dup? ?, value 636 | dd n dup ? 637 | else match n =dup? v, value 638 | repeat n 639 | dword v 640 | end repeat 641 | else 642 | dword value 643 | end match 644 | end iterate 645 | end macro 646 | 647 | struc dd? definitions& 648 | label . : dword 649 | iterate value,definitions 650 | match ?, value 651 | dd ? 652 | else match n =dup? ?, value 653 | dd n dup ? 654 | else match n =dup? v, value 655 | repeat n 656 | dword v 657 | end repeat 658 | else 659 | dword value 660 | end match 661 | end iterate 662 | end struc 663 | 664 | macro dq? definitions& 665 | iterate value,definitions 666 | match ?, value 667 | dq ? 668 | else match n =dup? ?, value 669 | dq n dup ? 670 | else match n =dup? v, value 671 | repeat n 672 | qword v 673 | end repeat 674 | else 675 | qword value 676 | end match 677 | end iterate 678 | end macro 679 | 680 | struc dq? definitions& 681 | label . : qword 682 | iterate value,definitions 683 | match ?, value 684 | dq ? 685 | else match n =dup? ?, value 686 | dq n dup ? 687 | else match n =dup? v, value 688 | repeat n 689 | qword v 690 | end repeat 691 | else 692 | qword value 693 | end match 694 | end iterate 695 | end struc 696 | 697 | postpone 698 | purge section? 699 | section 700 | namespace PE 701 | SIZE_OF_IMAGE := SECTION_BASE - IMAGE_BASE 702 | NUMBER_OF_SECTIONS := SECTION_INDEX 703 | NUMBER_OF_RELOCATIONS := RELOCATION_INDEX 704 | if defined Settings.ComputeCheckSum & Settings.ComputeCheckSum 705 | match list, CheckSumBlocks 706 | CHECKSUM = 0 707 | iterate ,list 708 | repeat (DATA_END-DATA_START) shr 1, POSITION:0 709 | load H:word from AREA:DATA_START+POSITION shl 1 710 | CHECKSUM = CHECKSUM + H 711 | end repeat 712 | if (DATA_END-DATA_START) and 1 713 | load H:byte from AREA:DATA_END-1 714 | CHECKSUM = CHECKSUM + H 715 | end if 716 | while CHECKSUM shr 16 717 | CHECKSUM = CHECKSUM shr 16 + CHECKSUM and 0FFFFh 718 | end while 719 | end iterate 720 | CHECKSUM = CHECKSUM + $% 721 | store CHECKSUM at PE:OptionalHeader.CheckSum 722 | end match 723 | end if 724 | end namespace 725 | end postpone 726 | -------------------------------------------------------------------------------- /include/stub.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/include/stub.com -------------------------------------------------------------------------------- /include/utf8.inc: -------------------------------------------------------------------------------- 1 | 2 | ; UTF-8 3 | 4 | macro du? arg 5 | local current,__input,char 6 | if arg eqtype '' 7 | virtual at 0 8 | __input:: 9 | db arg 10 | count = $ 11 | end virtual 12 | current = 0 13 | while current < count 14 | load char byte from __input:current 15 | wide = char 16 | current = current + 1 17 | if char > 0C0h 18 | if char < 0E0h 19 | wide = char and 11111b 20 | load char byte from __input:current 21 | wide = wide shl 6 + (char and 111111b) 22 | current = current + 1 23 | else if char < 0F0h 24 | wide = char and 1111b 25 | load char byte from __input:current 26 | wide = wide shl 6 + (char and 111111b) 27 | load char byte from __input:current+1 28 | wide = wide shl 6 + (char and 111111b) 29 | current = current + 2 30 | else if char < 0F8h 31 | wide = char and 111b 32 | load char byte from __input:current 33 | wide = wide shl 6 + (char and 111111b) 34 | load char byte from __input:current+1 35 | wide = wide shl 6 + (char and 111111b) 36 | load char byte from __input:current+2 37 | wide = wide shl 6 + (char and 111111b) 38 | current = current + 3 39 | else if char < 0FCh 40 | wide = char and 11b 41 | load char byte from __input:current 42 | wide = wide shl 6 + (char and 111111b) 43 | load char byte from __input:current+1 44 | wide = wide shl 6 + (char and 111111b) 45 | load char byte from __input:current+2 46 | wide = wide shl 6 + (char and 111111b) 47 | load char byte from __input:current+3 48 | wide = wide shl 6 + (char and 111111b) 49 | current = current + 4 50 | else 51 | wide = char and 1 52 | load char byte from __input:current 53 | wide = wide shl 6 + (char and 111111b) 54 | load char byte from __input:current+1 55 | wide = wide shl 6 + (char and 111111b) 56 | load char byte from __input:current+2 57 | wide = wide shl 6 + (char and 111111b) 58 | load char byte from __input:current+3 59 | wide = wide shl 6 + (char and 111111b) 60 | load char byte from __input:current+4 61 | wide = wide shl 6 + (char and 111111b) 62 | current = current + 5 63 | end if 64 | end if 65 | if wide < 10000h 66 | dw wide 67 | else 68 | dw 0D7C0h + wide shr 10,0DC00h or (wide and 3FFh) 69 | end if 70 | end while 71 | else 72 | dw arg 73 | end if 74 | end macro 75 | 76 | macro du? args& 77 | iterate arg,args 78 | du arg 79 | end iterate 80 | end macro 81 | 82 | struc du? args& 83 | label . word 84 | du args 85 | end struc 86 | -------------------------------------------------------------------------------- /intel/Readme.txt: -------------------------------------------------------------------------------- 1 | This directory contains the demo samples from the EBC Debugger. -------------------------------------------------------------------------------- /intel/ebcdemo.asm: -------------------------------------------------------------------------------- 1 | ; ebcdemo.asm 2 | ; Taken from EBCDebugger's EbcDemo/EbcDemo.cod 3 | ; See http://www.uefi.org/node/550 4 | 5 | include 'ebc.inc' 6 | include 'efi.inc' 7 | include 'format.inc' 8 | include 'utf8.inc' 9 | 10 | format peebc efi 11 | entry EfiMain 12 | 13 | section '.text' code executable readable 14 | EfiMain: 15 | MOVqw R0, R0(+0,-32) 16 | MOVnw @R0, R6 17 | MOVnw R7, @R0 18 | CMPIugte R7, 40 19 | JMP8cs _B1_4 20 | _B1_3: 21 | MOVnw R7, @R0 22 | MOVqw R4, R0(+0,+8) 23 | MOVnw R5, @R0 24 | ADD R4, R5 25 | MOVbw @R4, R7 26 | MOVnw R7, @R0 27 | ADD R7, R6(+0,+1) 28 | MOVnw @R0, R7 29 | MOVnw R7, @R0 30 | CMPIugte R7, 40 31 | JMP8cc _B1_3 32 | _B1_4: 33 | MOVqd R7, R6 34 | MOVqw R0, R0(+0,+32) 35 | RET 36 | 37 | section '.data' data readable writeable 38 | 39 | section '.reloc' fixups data discardable 40 | -------------------------------------------------------------------------------- /intel/ebctest.asm: -------------------------------------------------------------------------------- 1 | ; ebctest.asm 2 | ; Taken from EBCDebugger's EbcTest/EbcTest.cod 3 | ; See http://www.uefi.org/node/550 4 | 5 | include 'ebc.inc' 6 | include 'efi.inc' 7 | include 'format.inc' 8 | include 'utf8.inc' 9 | 10 | format peebc efi 11 | entry EfiMain 12 | 13 | section '.text' code executable readable 14 | 15 | TestSubRoutine2: 16 | ; STATIC UINT8 TestVariable3 = 9; 17 | ; Arg5 = Arg1 + Arg2 + Arg3 + Arg4; 18 | MOVnw R7, @R0(+0,+16) 19 | MOVnw R4, @R0(+1,+16) 20 | ADD R7, R4 21 | MOVnw R4, @R0(+2,+16) 22 | ADD R7, R4 23 | MOVnw R4, @R0(+3,+16) 24 | ADD R7, R4 25 | MOVnw @R0(+4,+16), R7 26 | ; TestVariable1 = 6; 27 | MOVreld R7, TestVariable1 28 | MOVInw @R7, (0,6) 29 | ; TestVariable2 = Arg3 + TestVariable1 + TestVariable3; 30 | MOVnw R4, @R0(+2,+16) 31 | MOVnw R7, @R7 32 | ADD R4, R7 33 | MOVreld R7, TestVariable3 34 | MOVbw R7, @R7 35 | ADD R4, R7 36 | MOVreld R7, TestVariable2 37 | MOVqw @R7, R4 38 | ; return EFI_SUCCESS; 39 | MOVqd R7, R6 40 | RET 41 | 42 | TestSubRoutine: 43 | MOVqw R0, R0(+0,-80) 44 | ; Arg3 = Arg1 + Arg2; 45 | MOVnw R7, @R0(+0,+96) 46 | MOVnw R4, @R0(+1,+96) 47 | ADD R7, R4 48 | MOVnw @R0(+2,+96), R7 49 | ; Arg5 = Arg4 - Arg3; 50 | MOVnw R7, @R0(+2,+96) 51 | NEG R7, R7 52 | MOVnw R4, @R0(+3,+96) 53 | ADD R4, R7 54 | MOVnw @R0(+4,+96), R4 55 | ; Arg7 = Arg6 * Arg5; 56 | MOVnw R7, @R0(+5,+96) 57 | MOVnw R4, @R0(+4,+96) 58 | MUL R7, R4 59 | MOVnw @R0(+6,+96), R7 60 | ; Arg9 = Arg7 / Arg8; 61 | MOVnw R7, @R0(+6,+96) 62 | MOVnw R4, @R0(+7,+96) 63 | DIVU R7, R4 64 | MOVnw @R0(+8,+96), R7 65 | ; Arg10 = Arg7 % Arg6; 66 | MOVnw R7, @R0(+6,+96) 67 | MOVnw R4, @R0(+5,+96) 68 | MODU R7, R4 69 | MOVnw @R0(+9,+96), R7 70 | ; Arg10 = Arg10 | Arg9; 71 | MOVnw R7, @R0(+9,+96) 72 | MOVnw R4, @R0(+8,+96) 73 | OR R7, R4 74 | MOVnw @R0(+9,+96), R7 75 | ; Arg10 = Arg10 & Arg7; 76 | MOVnw R7, @R0(+9,+96) 77 | MOVnw R4, @R0(+6,+96) 78 | AND R7, R4 79 | MOVnw @R0(+9,+96), R7 80 | ; if (Arg1 == 0) { 81 | MOVnw R7, @R0(+0,+96) 82 | CMPeq R7, R6 83 | JMP8cs _B2_6 84 | ; return EFI_SUCCESS; 85 | ; } 86 | ; TestSubRoutine (0, 2, 3, 4, 5, 6, 7, 8, 9, 10); 87 | MOVnw @R0, R6 88 | MOVInw @R0(1,0), (0,2) 89 | MOVInw @R0(2,0), (0,3) 90 | MOVInw @R0(3,0), (0,4) 91 | MOVInw @R0(4,0), (0,5) 92 | MOVInw @R0(5,0), (0,6) 93 | MOVInw @R0(6,0), (0,7) 94 | MOVInw @R0(7,0), (0,8) 95 | MOVInw @R0(8,0), (0,9) 96 | MOVInw @R0(9,0), (0,10) 97 | CALL TestSubRoutine 98 | ; TestSubRoutine2 (Arg1, Arg2, Arg7, Arg9, Arg10); 99 | MOVnw @R0, @R0(+0,+96) 100 | MOVnw @R0(+1,+0), @R0(+1,+96) 101 | MOVnw @R0(+2,+0), @R0(+6,+96) 102 | MOVnw @R0(+3,+0), @R0(+8,+96) 103 | MOVnw @R0(+4,+0), @R0(+9,+96) 104 | CALL TestSubRoutine2 105 | _B2_6: 106 | ; return EFI_SUCCESS; 107 | MOVqd R7, R6 108 | MOVqw R0, R0(+0,+80) 109 | RET 110 | 111 | EfiMain: 112 | CALL BSSInit 113 | MOVqw R0, R0(+0,-112) 114 | ; UINT16 test = 0x1234; 115 | MOVIww @R0(+0,+88), +4660 116 | ; EFI_STATUS Status; 117 | ; SystemTable->ConOut->OutputString ( 118 | MOVnw R7, @R0(+1,+128) 119 | MOVnw R7, @R7(+5,+24) 120 | ; SystemTable->ConOut, 121 | MOVnw R4, @R0(+1,+128) 122 | MOVnw @R0, @R4(+5,+24) 123 | MOVreld R4, __STRING$1 124 | MOVnw @R0(+1,+0), R4 125 | CALLEX @R7(+1,+0) 126 | ; L"Hello EBC Test!\r\n" 127 | ; ); 128 | ; TestVariable1 = 6; 129 | MOVreld R7, TestVariable1 130 | MOVInw @R7, (0,6) 131 | ; TestSubRoutineSub (1, 5); 132 | MOVInw @R0, (0,1) 133 | MOVInw @R0(1,0), (0,5) 134 | CALL TestSubRoutineSub 135 | ; SystemTable->ConOut->OutputString ( 136 | MOVnw R7, @R0(+1,+128) 137 | MOVnw R7, @R7(+5,+24) 138 | ; SystemTable->ConOut, 139 | MOVnw R4, @R0(+1,+128) 140 | MOVnw @R0, @R4(+5,+24) 141 | ; TestStr 142 | MOVreld R4, TestStr 143 | MOVnw @R0(+1,+0), @R4 144 | CALLEX @R7(+1,+0) 145 | ; ); 146 | ; test = test & 0xFF; 147 | MOVww @R0(+0,+88), @R0(+0,+88) 148 | 149 | ; Status = TestSubRoutine (1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 150 | MOVInw @R0, (0,1) 151 | MOVInw @R0(1,0), (0,2) 152 | MOVInw @R0(2,0), (0,3) 153 | MOVInw @R0(3,0), (0,4) 154 | MOVInw @R0(4,0), (0,5) 155 | MOVInw @R0(5,0), (0,6) 156 | MOVInw @R0(6,0), (0,7) 157 | MOVInw @R0(7,0), (0,8) 158 | MOVInw @R0(8,0), (0,9) 159 | MOVInw @R0(9,0), (0,10) 160 | CALL TestSubRoutine 161 | MOVnw @R0(+0,+96), R7 162 | MOVnw @R0(+0,+80), @R0(+0,+96) 163 | ; SystemTable->ConOut->OutputString ( 164 | MOVnw R7, @R0(+1,+128) 165 | MOVnw R7, @R7(+5,+24) 166 | ; SystemTable->ConOut, 167 | MOVnw R4, @R0(+1,+128) 168 | MOVnw @R0, @R4(+5,+24) 169 | MOVreld R4, __STRING$2 170 | MOVnw @R0(+1,+0), R4 171 | CALLEX @R7(+1,+0) 172 | ; L"Goodbye EBC Test!\r\n 173 | ; );" 174 | ; return Status; 175 | MOVnw R7, @R0(+0,+80) 176 | MOVqw R0, R0(+0,+112) 177 | BREAK 3 178 | RET 179 | 180 | TestSubRoutineSub: 181 | ; Arg2 = Arg1 + Arg2; 182 | MOVnw R7, @R0(+0,+16) 183 | MOVnw R4, @R0(+1,+16) 184 | ADD R7, R4 185 | MOVnw @R0(+1,+16), R7 186 | ; return EFI_SUCCESS; 187 | MOVqd R7, R6 188 | RET 189 | 190 | BSSInit: 191 | MOVreld R4, TestStr 192 | MOVreld R5, __STRING$0 193 | MOVnd @R4, R5 194 | MOVreld R4, TestVariable1 195 | MOVInw @R4, (0,4) 196 | RET 197 | 198 | section '.data' data readable writeable 199 | __STRING$2: DU "Goodbye EBC Test!", 0x0D, 0x0A, 0x00 200 | __STRING$1: DU "Hello EBC Test!", 0x0D, 0x0A, 0x00 201 | __STRING$0: DU "789456123", 0x0D, 0x0A, 0x00 202 | TestStr: DD 2 DUP ? 203 | TestVariable1: DD 2 DUP ? 204 | TestVariable2: DD 0x00000003, 0x00000000 205 | TestVariable3: DB 9 206 | 207 | section '.reloc' fixups data discardable 208 | -------------------------------------------------------------------------------- /internal/Readme.txt: -------------------------------------------------------------------------------- 1 | EBC assembly samples that are used for internal development only. -------------------------------------------------------------------------------- /internal/full.asm: -------------------------------------------------------------------------------- 1 | ; 2 | ; EBC (EFI Byte Code) full instruction set test 3 | ; 4 | 5 | include 'ebc.inc' 6 | include 'efi.inc' 7 | include 'format.inc' 8 | 9 | format peebc efi 10 | entry EfiMain 11 | 12 | section '.text' code executable readable 13 | 14 | EfiMain: 15 | ADD32 R1, R0 16 | AND32 @R1, @R0 17 | ASHR32 @R1, R0(1234) 18 | DIV32 R1, @R0(+12,+24) 19 | DIVU64 R1, R0 20 | EXTNDB64 R1, @R0 21 | EXTNDD64 R1, R0(5678) 22 | EXTNDW64 @R1, @R0(SIMPLE_TEXT_INPUT_INTERFACE.Reset) 23 | MOD R2, R6 24 | MODU @R2, R3 25 | MUL R5, @R5 26 | MULU @R6, R6(4321) 27 | NEG R7, R6(0xFFFF) 28 | NOT32 R3, R1(-56) 29 | OR64 @R4, R1(-0x8000) 30 | SHL @R2, R0(-0x12,-0x30) 31 | SHR32 R1, @R1(0,EfiMain-$) 32 | SUB64 @R0, R1(EFI_MAIN_PARAMETERS.SystemTable) 33 | XOR32 @R1, @R1(-12, EfiMain-Exit) 34 | ADD R7, R6(+0,+1) 35 | 36 | CALL32 R1 37 | CALL32 R1(EfiMain) 38 | CALL64 0x1234567812345678 39 | CALL 0x123456 40 | CALLEX Exit + 2 41 | CALLEX32 @R0(Exit - EfiMain, 1) 42 | 43 | CMP32eq R1, R0 44 | CMP64lte R1, @R0 45 | CMPgte R1, R4(-5678) 46 | CMP32ulte R1, @R4(-12,-124) 47 | CMP64ugte R2, R4(-0,+60) 48 | CMPI32weq @R1, 1234 - 5678 49 | CMPI64dlte R2, 0x8000000 50 | CMPIgte @R3(+12,+68), 0x8000000 51 | CMPI32wulte @R2(-12,16-32), 1234-5678 52 | CMPI64dugte R2, EfiMain 53 | 54 | JMP Exit 55 | JMP32cc R1(Exit) 56 | JMP32cc R1(0x12345678) 57 | JMP64cs 0x8000000000000 58 | JMP @R1(0x80000+0x800000,7*9-56) 59 | JMP8cc Exit 60 | JMP -0x8000000000000000 61 | 62 | LOADSP [Flags], R7 63 | STORESP R1, [IP] 64 | STORESP R2, [Flags] 65 | POP32 R1 66 | POP64 R3(1234) 67 | POP32 R1(+1,+8) 68 | POP @R4(512,2) 69 | POPn @R5(-11,-32) 70 | PUSH R0 71 | PUSH64 @R5 72 | PUSH32 R6(1024) 73 | PUSHn @R1(-10,-200) 74 | 75 | Exit: 76 | MOVbw @R1(+7,+128), @R2 77 | MOVbd @R1(-128,-512), @R2((1-8),(2-5)) 78 | MOVb @R1(0x800,0x800), R3 79 | MOVww @R1, @R3(-12,-64) 80 | MOVqq @R2, @R3 81 | MOVqq @R1(-0xFFFFFFFF,-0xFFFFFFF), R2 82 | MOV @R1(-0xFFFFFFFF,-0xFFFFFFF), R2 83 | MOVqq @R1(0x8000000,0x8000000), @R2(0x8000000,0x8000000) 84 | MOV @R1(0x8000000,0x8000000), @R2(0x8000000,0x8000000) 85 | MOVqq @R1(-0x7FFFFFF,-0x7FFFFFF), @R2(-0x7FFFFFFF,-0x7FFFFFF) 86 | MOVqd @R1(-0x1FFF, -0xFFF), R2 87 | MOVdd @R1, @R2 88 | MOV @R1, @R2 89 | MOVqw R0, R0(+0,+112) 90 | 91 | MOVIww R1, 0xFFFF 92 | MOVIwd @R1, -0x7FFF 93 | MOVIw @R1, Exit 94 | MOVI @R1(-0xF, -0xF), (EfiMain - Exit)*8 95 | MOVIq @R1(+5,+9), 0x123456789ABCD 96 | MOVI @R1(+5,+9), 0x123456789ABCD 97 | MOVInw R1, (+12,+50) 98 | MOVInd @R1, (-0x1FFF,-0xFFF) 99 | MOVIn @R1, (-0x1FFF,-0xFFF) 100 | MOVIn R0, (EFI_SYSTEM_TABLE.ConIn) 101 | MOVInq @R2(+8,+16), (-0x7FFFFFFF,-0x7FFFFFF) 102 | MOVIn @R2(+8,+16), (-0x7FFFFFFF,-0x7FFFFFF) 103 | 104 | MOVnw R0, R1 105 | MOVnd @R0, @R1 106 | MOVnw @R0(55,44), R1 107 | MOVnd R0, R0(+2222,+111) 108 | MOVn @R0(1234,5678), @R2(2345,6789) 109 | MOVsnw R0, R1(1235) 110 | MOVsnd @R0(45,67), R1((EfiMain - Exit)*8) 111 | MOVsn @R0(+1,+8), R1(12345678) 112 | MOVsnd @R0(-0x1FFF,-0xFFF), R1(0xFFFFFFFF) 113 | MOVsn @R0(-0x1FFF,-0xFFF), @R0(-0x1FFF,-0xFFF) 114 | 115 | MOVRELw R1, -12 116 | MOVRELd @R1, EfiMain 117 | MOVREL @R1(+64,+4), 0x123456789ABCD 118 | 119 | RET 120 | BREAK 12 121 | -------------------------------------------------------------------------------- /internal/test.asm: -------------------------------------------------------------------------------- 1 | ; 2 | ; EBC (EFI Byte Code) assembly test 3 | ; 4 | 5 | include 'ebc.inc' 6 | include 'efi.inc' 7 | include 'format.inc' 8 | 9 | format peebc efi 10 | entry EfiMain 11 | 12 | section '.text' code executable readable 13 | EfiMain: 14 | MOVI R6, EFIAPI(INT64, INT32, CHAR8*, UINT64, INT32) 15 | MOVsn @R0(+1,+8), R1(12345678) 16 | 17 | section '.data' data readable writeable 18 | 19 | Test: EFIAPI(UINT64, VOID*, INT64, INT32) 20 | -------------------------------------------------------------------------------- /machine.asm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/machine.asm -------------------------------------------------------------------------------- /make.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | set include=include 3 | 4 | set UEFI_EXT=x64 5 | set QEMU_ARCH=x86_64 6 | set QEMU_PATH=C:\Program Files\qemu\ 7 | set QEMU_OPTS=-net none -monitor none -parallel none 8 | set FIRMWARE_BASENAME=OVMF 9 | set FILE=hello 10 | set RUN_QEMU= 11 | set RUN_DEBUGGER= 12 | set COPY_SRC= 13 | set FW_EXT= 14 | set HDA=fat:image 15 | set QEMU_EXTRA= 16 | 17 | :loop 18 | if [%1]==[] goto next 19 | if [%1]==[debug] ( 20 | set RUN_QEMU=1 21 | set RUN_DEBUGGER=1 22 | ) else if [%1]==[qemu] ( 23 | if not exist "%QEMU_PATH%" ( 24 | echo %QEMU_PATH% is missing! 25 | goto end 26 | ) 27 | set RUN_QEMU=1 28 | ) else if [%1]==[x64] ( 29 | rem nothing to do 30 | ) else if [%1]==[ia32] ( 31 | set UEFI_EXT=ia32 32 | set QEMU_ARCH=i386 33 | ) else if [%1]==[arm] ( 34 | set UEFI_EXT=arm 35 | set QEMU_ARCH=arm 36 | set QEMU_OPTS=-M virt -cpu cortex-a15 %QEMU_OPTS% 37 | set FIRMWARE_BASENAME=QEMU_EFI 38 | ) else if [%1]==[aa64] ( 39 | set UEFI_EXT=aa64 40 | set QEMU_ARCH=aarch64 41 | set QEMU_OPTS=-M virt -cpu cortex-a57 %QEMU_OPTS% 42 | set FIRMWARE_BASENAME=QEMU_EFI 43 | ) else if [%1]==[serial] ( 44 | set QEMU_OPTS=%QEMU_OPTS% -serial file:serial_%UEFI_EXT%.log 45 | ) else if [%1]==[ntfs] ( 46 | set FW_EXT=_ntfs 47 | set HDA=ntfs.vhd 48 | set QEMU_EXTRA=-hdb fat:image 49 | echo This is a FAT file system > image/THIS_IS_FAT.txt 50 | if not exist ntfs.vhd ( 51 | call cscript /nologo "%~dp0download.vbs" http://efi.akeo.ie/EBC/FAT ntfs.zip ntfs.vhd ntfs.vhd "An NTFS test VHD including a Fat EBC driver" 52 | if errorlevel 1 goto end 53 | echo. 54 | ) 55 | ) else if [%1]==[copy] ( 56 | set COPY_SRC=\\vm-debian\src\edk2\Build\ArmVirtQemu-ARM\RELEASE_GCC5\FV\QEMU_EFI.fd 57 | ) else ( 58 | set FILE=%1 59 | if not exist "%1.asm" ( 60 | echo %1.asm does not exist! 61 | goto end 62 | ) 63 | ) 64 | shift 65 | goto loop 66 | 67 | :next 68 | if not exist fasmg.exe ( 69 | call cscript /nologo "%~dp0download.vbs" https://flatassembler.net fasmg.zip fasmg.exe fasmg.exe "The latest fasmg assembler" 70 | if errorlevel 1 goto end 71 | echo. 72 | ) 73 | 74 | echo fasmg %FILE%.asm %FILE%.efi 75 | fasmg %FILE%.asm %FILE%.efi 76 | if not %errorlevel%==0 goto end 77 | 78 | if [%RUN_QEMU%]==[] goto end 79 | 80 | set UEFI_EXT_UPPERCASE=X64 81 | if [%UEFI_EXT%]==[ia32] ( 82 | set UEFI_EXT_UPPERCASE=IA32 83 | ) else if [%UEFI_EXT%]==[arm] ( 84 | set UEFI_EXT_UPPERCASE=ARM 85 | ) else if [%UEFI_EXT%]==[aa64] ( 86 | set UEFI_EXT_UPPERCASE=AA64 87 | ) 88 | 89 | set QEMU_FIRMWARE=%FIRMWARE_BASENAME%_%UEFI_EXT_UPPERCASE%%FW_EXT%.fd 90 | set QEMU_EXE=qemu-system-%QEMU_ARCH%w.exe 91 | set ZIP_FILE=%FIRMWARE_BASENAME%-%UEFI_EXT_UPPERCASE%%FW_EXT%.zip 92 | if not [%COPY_SRC%]==[] ( 93 | echo Copy %COPY_SRC% to %QEMU_FIRMWARE% 94 | copy %COPY_SRC% %QEMU_FIRMWARE% 95 | ) else if not exist %QEMU_FIRMWARE% ( 96 | call cscript /nologo "%~dp0download.vbs" http://efi.akeo.ie/%FIRMWARE_BASENAME% %ZIP_FILE% %FIRMWARE_BASENAME%.fd %QEMU_FIRMWARE% "The UEFI firmware file, needed for QEMU," 97 | if errorlevel 1 goto end 98 | ) 99 | 100 | if [%UEFI_EXT%]==[arm] ( 101 | echo. 102 | echo Notice: EBC support for ARM is not yet integrated into EDK2 103 | echo This means that a specially patched UEFI firmware is required 104 | echo for EBC to work on ARM... 105 | ) 106 | 107 | if not exist image\efi\boot mkdir image\efi\boot 108 | del image\efi\boot\boot*.efi > NUL 2>&1 109 | del image\efi\boot\startup.nsh > NUL 2>&1 110 | if not [%RUN_DEBUGGER%]==[] ( 111 | echo fs0: > image\efi\boot\startup.nsh 112 | if not exist "Ebc Debugger\EbcDebugger_%UEFI_EXT%.efi" ( 113 | if not exist "EBC Debugger" mkdir "EBC Debugger" 114 | call cscript /nologo "%~dp0download.vbs" http://efi.akeo.ie/EBC/Debugger EbcDebugger-%UEFI_EXT_UPPERCASE%.zip EbcDebugger.efi "EBC Debugger\EbcDebugger_%UEFI_EXT%.efi" "The EBC Debugger" 115 | if errorlevel 1 goto end 116 | ) 117 | copy "EBC Debugger\EbcDebugger_%UEFI_EXT%.efi" image\EbcDebugger_%UEFI_EXT%.efi >NUL 118 | echo load EbcDebugger_%UEFI_EXT%.efi >> image\efi\boot\startup.nsh 119 | ) 120 | if [%FILE%]==[protocol] ( 121 | copy %FILE%.efi image\%FILE%.efi >NUL 122 | copy protocol_driver\driver_%UEFI_EXT%.efi image > NUL 123 | if not exist "image\efi\boot\startup.nsh" ( 124 | echo fs0: > image\efi\boot\startup.nsh 125 | ) 126 | echo load driver_%UEFI_EXT%.efi >> image\efi\boot\startup.nsh 127 | echo %FILE%.efi >> image\efi\boot\startup.nsh 128 | ) else if [%FILE%]==[driver] ( 129 | copy %FILE%.efi image\driver_ebc.efi >NUL 130 | if not exist "image\efi\boot\startup.nsh" ( 131 | echo fs0: > image\efi\boot\startup.nsh 132 | ) 133 | echo load driver_ebc.efi >> image\efi\boot\startup.nsh 134 | rem echo drivers >> image\efi\boot\startup.nsh 135 | copy native\native_%UEFI_EXT%.efi image >NUL 136 | echo native_%UEFI_EXT%.efi >> image\efi\boot\startup.nsh 137 | ) else ( 138 | if exist "image\efi\boot\startup.nsh" ( 139 | copy %FILE%.efi image >NUL 140 | echo %FILE%.efi >> image\efi\boot\startup.nsh 141 | ) else ( 142 | copy %FILE%.efi image\efi\boot\boot%UEFI_EXT%.efi >NUL 143 | ) 144 | ) 145 | 146 | echo. 147 | echo %QEMU_EXE% %QEMU_OPTS% -L . -bios %QEMU_FIRMWARE% -hda %HDA% %QEMU_EXTRA% 148 | "%QEMU_PATH%%QEMU_EXE%" %QEMU_OPTS% -L . -bios %QEMU_FIRMWARE% -hda %HDA% %QEMU_EXTRA% 149 | rem del /q trace-* >NUL 2>&1 150 | 151 | :end 152 | -------------------------------------------------------------------------------- /native/.msvc/gnu-efi.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | ARM 7 | 8 | 9 | Debug 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | ARM 19 | 20 | 21 | Release 22 | Win32 23 | 24 | 25 | Release 26 | x64 27 | 28 | 29 | 30 | {3135D563-9596-4584-9ED6-616ADEC52974} 31 | gnuefi 32 | 33 | 34 | 35 | StaticLibrary 36 | true 37 | v140 38 | Unicode 39 | 40 | 41 | StaticLibrary 42 | true 43 | v140 44 | Unicode 45 | 46 | 47 | StaticLibrary 48 | true 49 | v140 50 | Unicode 51 | 52 | 53 | StaticLibrary 54 | false 55 | v140 56 | true 57 | Unicode 58 | 59 | 60 | StaticLibrary 61 | false 62 | v140 63 | true 64 | Unicode 65 | 66 | 67 | StaticLibrary 68 | false 69 | v140 70 | true 71 | Unicode 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | $(SolutionDir)x64\$(Configuration)\ 97 | $(OutDir)$(ProjectName)\ 98 | 99 | 100 | $(SolutionDir)ia32\$(Configuration)\ 101 | $(OutDir)$(ProjectName)\ 102 | 103 | 104 | $(SolutionDir)arm\$(Configuration)\ 105 | $(OutDir)$(ProjectName)\ 106 | 107 | 108 | $(SolutionDir)x64\$(Configuration)\ 109 | $(OutDir)$(ProjectName)\ 110 | 111 | 112 | $(SolutionDir)ia32\$(Configuration)\ 113 | $(OutDir)$(ProjectName)\ 114 | 115 | 116 | $(SolutionDir)arm\$(Configuration)\ 117 | $(OutDir)$(ProjectName)\ 118 | 119 | 120 | 121 | Level3 122 | Disabled 123 | $(SolutionDir)\..\gnu-efi\inc;$(SolutionDir)\..\gnu-efi\inc\x86_64;$(SolutionDir)\..\gnu-efi\inc\protocol;$(SolutionDir)\..\gnu-efi\lib 124 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 125 | false 126 | CompileAsC 127 | MultiThreadedDebug 128 | 4312 129 | ProgramDatabase 130 | Default 131 | false 132 | 133 | 134 | true 135 | 136 | 137 | EFI Application 138 | true 139 | 140 | 141 | 142 | 143 | Level3 144 | Disabled 145 | $(SolutionDir)\..\gnu-efi\inc;$(SolutionDir)\..\gnu-efi\inc\ia32;$(SolutionDir)\..\gnu-efi\inc\protocol;$(SolutionDir)\..\gnu-efi\lib 146 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 147 | false 148 | CompileAsC 149 | MultiThreadedDebug 150 | ProgramDatabase 151 | 4312 152 | Default 153 | false 154 | 155 | 156 | true 157 | 158 | 159 | EFI Application 160 | true 161 | 162 | 163 | 164 | 165 | Level3 166 | Disabled 167 | $(SolutionDir)\..\gnu-efi\inc;$(SolutionDir)\..\gnu-efi\inc\arm;$(SolutionDir)\..\gnu-efi\inc\protocol;$(SolutionDir)\..\gnu-efi\lib 168 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 169 | false 170 | CompileAsC 171 | MultiThreadedDebug 172 | ProgramDatabase 173 | 4312 174 | Default 175 | false 176 | 177 | 178 | true 179 | 180 | 181 | EFI Application 182 | true 183 | 184 | 185 | 186 | 187 | Level3 188 | $(SolutionDir)\..\gnu-efi\inc;$(SolutionDir)\..\gnu-efi\inc\x86_64;$(SolutionDir)\..\gnu-efi\inc\protocol;$(SolutionDir)\..\gnu-efi\lib 189 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 190 | false 191 | CompileAsC 192 | MultiThreaded 193 | 4312 194 | false 195 | false 196 | 197 | 198 | true 199 | true 200 | true 201 | 202 | 203 | EFI Application 204 | true 205 | 206 | 207 | 208 | 209 | Level3 210 | $(SolutionDir)\..\gnu-efi\inc;$(SolutionDir)\..\gnu-efi\inc\ia32;$(SolutionDir)\..\gnu-efi\inc\protocol;$(SolutionDir)\..\gnu-efi\lib 211 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 212 | false 213 | CompileAsC 214 | MultiThreaded 215 | 4312 216 | false 217 | false 218 | 219 | 220 | true 221 | true 222 | true 223 | 224 | 225 | EFI Application 226 | true 227 | 228 | 229 | 230 | 231 | Level3 232 | $(SolutionDir)\..\gnu-efi\inc;$(SolutionDir)\..\gnu-efi\inc\arm;$(SolutionDir)\..\gnu-efi\inc\protocol;$(SolutionDir)\..\gnu-efi\lib 233 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 234 | false 235 | CompileAsC 236 | MultiThreaded 237 | 4312 238 | false 239 | false 240 | 241 | 242 | true 243 | true 244 | true 245 | 246 | 247 | EFI Application 248 | true 249 | 250 | 251 | 252 | 253 | false 254 | false 255 | true 256 | true 257 | true 258 | true 259 | 260 | 261 | true 262 | true 263 | true 264 | true 265 | false 266 | false 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | true 282 | true 283 | true 284 | true 285 | false 286 | false 287 | 288 | 289 | true 290 | true 291 | true 292 | true 293 | false 294 | false 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | true 310 | true 311 | true 312 | true 313 | false 314 | false 315 | 316 | 317 | false 318 | false 319 | true 320 | true 321 | true 322 | true 323 | 324 | 325 | 326 | 327 | 328 | -------------------------------------------------------------------------------- /native/.msvc/gnu-efi.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {20c8e9bd-0fa8-46d3-b825-e3eebd64ab3d} 14 | 15 | 16 | {87122940-e80f-416d-a840-5e32f703f3ff} 17 | 18 | 19 | {e6e3d25a-4fce-4036-bef9-3cfbafc4baaf} 20 | 21 | 22 | 23 | 24 | Source Files 25 | 26 | 27 | Source Files 28 | 29 | 30 | Source Files 31 | 32 | 33 | Source Files 34 | 35 | 36 | Source Files 37 | 38 | 39 | Source Files 40 | 41 | 42 | Source Files 43 | 44 | 45 | Source Files 46 | 47 | 48 | Source Files 49 | 50 | 51 | Source Files 52 | 53 | 54 | Source Files 55 | 56 | 57 | Source Files 58 | 59 | 60 | Source Files 61 | 62 | 63 | Source Files 64 | 65 | 66 | Source Files 67 | 68 | 69 | Source Files 70 | 71 | 72 | Source Files 73 | 74 | 75 | Source Files 76 | 77 | 78 | Source Files 79 | 80 | 81 | Source Files 82 | 83 | 84 | Source Files 85 | 86 | 87 | Source Files 88 | 89 | 90 | Source Files 91 | 92 | 93 | Source Files 94 | 95 | 96 | Source Files\arm 97 | 98 | 99 | Source Files\x86_64 100 | 101 | 102 | Source Files\ia32 103 | 104 | 105 | Source Files\x86_64 106 | 107 | 108 | Source Files\ia32 109 | 110 | 111 | Source Files\arm 112 | 113 | 114 | -------------------------------------------------------------------------------- /native/.msvc/gnu-efi.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /native/.msvc/native.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | ARM 7 | 8 | 9 | Debug 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | ARM 19 | 20 | 21 | Release 22 | Win32 23 | 24 | 25 | Release 26 | x64 27 | 28 | 29 | 30 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE} 31 | native 32 | 33 | 34 | 35 | Application 36 | true 37 | v140 38 | Unicode 39 | 40 | 41 | Application 42 | true 43 | v140 44 | Unicode 45 | 46 | 47 | Application 48 | true 49 | v140 50 | Unicode 51 | 52 | 53 | Application 54 | false 55 | v140 56 | Unicode 57 | 58 | 59 | Application 60 | false 61 | v140 62 | Unicode 63 | 64 | 65 | Application 66 | false 67 | v140 68 | Unicode 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | .efi 94 | false 95 | false 96 | $(SolutionDir)x64\$(Configuration)\ 97 | $(OutDir)$(ProjectName)\ 98 | 99 | 100 | .efi 101 | false 102 | false 103 | $(SolutionDir)ia32\$(Configuration)\ 104 | $(OutDir)$(ProjectName)\ 105 | 106 | 107 | .efi 108 | false 109 | false 110 | $(SolutionDir)arm\$(Configuration)\ 111 | $(OutDir)$(ProjectName)\ 112 | 113 | 114 | .efi 115 | false 116 | false 117 | $(SolutionDir)x64\$(Configuration)\ 118 | $(OutDir)$(ProjectName)\ 119 | 120 | 121 | .efi 122 | false 123 | false 124 | $(SolutionDir)ia32\$(Configuration)\ 125 | $(OutDir)$(ProjectName)\ 126 | 127 | 128 | .efi 129 | false 130 | false 131 | $(SolutionDir)arm\$(Configuration)\ 132 | $(OutDir)$(ProjectName)\ 133 | 134 | 135 | 136 | $(SolutionDir)\..\gnu-efi\inc;$(SolutionDir)\..\gnu-efi\inc\x86_64 137 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 138 | false 139 | CompileAsC 140 | Level3 141 | 4091 142 | ProgramDatabase 143 | Default 144 | false 145 | 146 | 147 | EFI Application 148 | 149 | 150 | true 151 | 152 | 153 | gnu-efi.lib;libcmtd.lib;%(AdditionalDependencies) 154 | false 155 | false 156 | true 157 | efi_main 158 | EFI Application 159 | $(OutDir);%(AdditionalLibraryDirectories) 160 | true 161 | 162 | 163 | echo copy $(TargetDir)$(TargetFileName) $(SolutionDir)native_x64.efi 164 | copy $(TargetDir)$(TargetFileName) $(SolutionDir)native_x64.efi 165 | 166 | 167 | 168 | 169 | $(SolutionDir)\..\gnu-efi\inc;$(SolutionDir)\..\gnu-efi\inc\ia32 170 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 171 | false 172 | CompileAsC 173 | Level3 174 | ProgramDatabase 175 | 4091 176 | Default 177 | false 178 | 179 | 180 | EFI Application 181 | 182 | 183 | true 184 | 185 | 186 | gnu-efi.lib;libcmtd.lib;%(AdditionalDependencies) 187 | false 188 | false 189 | true 190 | efi_main 191 | EFI Application 192 | $(OutDir);%(AdditionalLibraryDirectories) 193 | true 194 | MachineX86 195 | 196 | 197 | echo copy $(TargetDir)$(TargetFileName) $(SolutionDir)native_ia32.efi 198 | copy $(TargetDir)$(TargetFileName) $(SolutionDir)native_ia32.efi 199 | 200 | 201 | 202 | 203 | $(SolutionDir)\..\gnu-efi\inc;$(SolutionDir)\..\gnu-efi\inc\arm 204 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 205 | false 206 | CompileAsC 207 | Level3 208 | ProgramDatabase 209 | 4091 210 | Default 211 | false 212 | 213 | 214 | EFI Application 215 | 216 | 217 | true 218 | 219 | 220 | gnu-efi.lib;libcmtd.lib;%(AdditionalDependencies) 221 | false 222 | true 223 | efi_main 224 | EFI Application 225 | $(OutDir);%(AdditionalLibraryDirectories) 226 | true 227 | 228 | 229 | 230 | echo copy $(TargetDir)$(TargetFileName) $(SolutionDir)native_arm.efi 231 | copy $(TargetDir)$(TargetFileName) $(SolutionDir)native_arm.efi 232 | 233 | 234 | 235 | 236 | $(SolutionDir)\..\gnu-efi\inc;$(SolutionDir)\..\gnu-efi\inc\x86_64 237 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 238 | false 239 | CompileAsC 240 | Level3 241 | 4091 242 | false 243 | 244 | 245 | EFI Application 246 | 247 | 248 | true 249 | 250 | 251 | false 252 | 253 | 254 | false 255 | true 256 | efi_main 257 | EFI Application 258 | gnu-efi.lib;libcmt.lib;%(AdditionalDependencies) 259 | $(OutDir);%(AdditionalLibraryDirectories) 260 | true 261 | 262 | 263 | echo copy $(TargetDir)$(TargetFileName) $(SolutionDir)native_x64.efi 264 | copy $(TargetDir)$(TargetFileName) $(SolutionDir)native_x64.efi 265 | 266 | 267 | 268 | 269 | $(SolutionDir)\..\gnu-efi\inc;$(SolutionDir)\..\gnu-efi\inc\ia32 270 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 271 | false 272 | CompileAsC 273 | Level3 274 | 4091 275 | false 276 | 277 | 278 | EFI Application 279 | 280 | 281 | true 282 | 283 | 284 | false 285 | 286 | 287 | false 288 | true 289 | efi_main 290 | EFI Application 291 | gnu-efi.lib;libcmt.lib;%(AdditionalDependencies) 292 | $(OutDir);%(AdditionalLibraryDirectories) 293 | true 294 | 295 | 296 | echo copy $(TargetDir)$(TargetFileName) $(SolutionDir)native_ia32.efi 297 | copy $(TargetDir)$(TargetFileName) $(SolutionDir)native_ia32.efi 298 | 299 | 300 | 301 | 302 | $(SolutionDir)\..\gnu-efi\inc;$(SolutionDir)\..\gnu-efi\inc\arm 303 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 304 | false 305 | CompileAsC 306 | Level3 307 | 4091 308 | false 309 | 310 | 311 | EFI Application 312 | 313 | 314 | true 315 | 316 | 317 | 318 | false 319 | true 320 | efi_main 321 | EFI Application 322 | gnu-efi.lib;libcmt.lib;%(AdditionalDependencies) 323 | $(OutDir);%(AdditionalLibraryDirectories) 324 | true 325 | 326 | 327 | 328 | echo copy $(TargetDir)$(TargetFileName) $(SolutionDir)native_arm.efi 329 | copy $(TargetDir)$(TargetFileName) $(SolutionDir)native_arm.efi 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | -------------------------------------------------------------------------------- /native/.msvc/native.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | 14 | 15 | Source Files 16 | 17 | 18 | -------------------------------------------------------------------------------- /native/.msvc/native.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | WindowsLocalDebugger 5 | 6 | 7 | WindowsLocalDebugger 8 | 9 | 10 | WindowsLocalDebugger 11 | 12 | 13 | WindowsLocalDebugger 14 | 15 | 16 | WindowsLocalDebugger 17 | 18 | 19 | WindowsLocalDebugger 20 | 21 | -------------------------------------------------------------------------------- /native/Makefile: -------------------------------------------------------------------------------- 1 | ARCH = x64 2 | # You can alter the subsystem according to your EFI binary target: 3 | # 10 = EFI application 4 | # 11 = EFI boot service driver 5 | # 12 = EFI runtime driver 6 | SUBSYSTEM = 10 7 | 8 | # Try to auto-detect the target ARCH 9 | ifeq ($(shell uname -o),Msys) 10 | IS_MINGW32 = $(findstring MINGW32,$(shell uname -s)) 11 | IS_MINGW64 = $(findstring MINGW64,$(shell uname -s)) 12 | ifeq ($(IS_MINGW32),MINGW32) 13 | ARCH = ia32 14 | endif 15 | ifeq ($(IS_MINGW64),MINGW64) 16 | ARCH = x64 17 | endif 18 | else 19 | ifeq ($(shell uname -m),x86_64) 20 | ARCH = x64 21 | else ifeq ($(shell uname -m),arm) 22 | ARCH = arm 23 | CROSS_COMPILE = 24 | else 25 | ARCH = ia32 26 | endif 27 | endif 28 | 29 | # Auto-detect the host arch for MinGW 30 | ifeq ($(shell uname -m),x86_64) 31 | MINGW_HOST = w64 32 | else 33 | MINGW_HOST = w32 34 | endif 35 | 36 | ifeq ($(ARCH),x64) 37 | GNUEFI_ARCH = x86_64 38 | GCC_ARCH = x86_64 39 | CROSS_COMPILE = $(GCC_ARCH)-$(MINGW_HOST)-mingw32- 40 | EP_PREFIX = 41 | CFLAGS = -m64 -mno-red-zone 42 | LDFLAGS = -Wl,-dll -Wl,--subsystem,$(SUBSYSTEM) 43 | else ifeq ($(ARCH),ia32) 44 | GNUEFI_ARCH = ia32 45 | GCC_ARCH = i686 46 | CROSS_COMPILE = $(GCC_ARCH)-$(MINGW_HOST)-mingw32- 47 | EP_PREFIX = _ 48 | CFLAGS = -m32 -mno-red-zone 49 | LDFLAGS = -Wl,-dll -Wl,--subsystem,$(SUBSYSTEM) 50 | else ifeq ($(ARCH),arm) 51 | GNUEFI_ARCH = arm 52 | GCC_ARCH = arm 53 | CROSS_COMPILE = $(GCC_ARCH)-linux-gnueabihf- 54 | EP_PREFIX = 55 | CFLAGS = -marm -fpic -fshort-wchar 56 | LDFLAGS = -Wl,--no-wchar-size-warning -Wl,--defsym=EFI_SUBSYSTEM=$(SUBSYSTEM) 57 | CRT0_LIBS = -lgnuefi 58 | else ifeq ($(ARCH),aa64) 59 | GNUEFI_ARCH = aarch64 60 | GCC_ARCH = aarch64 61 | CROSS_COMPILE = $(GCC_ARCH)-linux-gnu- 62 | EP_PREFIX = 63 | CFLAGS = -fpic -fshort-wchar 64 | LDFLAGS = -Wl,--no-wchar-size-warning -Wl,--defsym=EFI_SUBSYSTEM=$(SUBSYSTEM) 65 | CRT0_LIBS = -lgnuefi 66 | endif 67 | OVMF_ARCH = $(shell echo $(ARCH) | tr a-z A-Z) 68 | OVMF_ZIP = OVMF-$(OVMF_ARCH).zip 69 | GNUEFI_DIR = $(CURDIR)/../gnu-efi 70 | GNUEFI_LIBS = lib 71 | 72 | # If the compiler produces an elf binary, we need to fiddle with a PE crt0 73 | ifneq ($(CRT0_LIBS),) 74 | CRT0_DIR = $(GNUEFI_DIR)/$(GNUEFI_ARCH)/gnuefi 75 | LDFLAGS += -L$(CRT0_DIR) -T $(GNUEFI_DIR)/gnuefi/elf_$(GNUEFI_ARCH)_efi.lds $(CRT0_DIR)/crt0-efi-$(GNUEFI_ARCH).o 76 | GNUEFI_LIBS += gnuefi 77 | endif 78 | 79 | # SYSTEMROOT is only defined on Windows systems 80 | ifneq ($(SYSTEMROOT),) 81 | # MinGW on Windows doesn't use (tuple)-ar but (tuple)-gcc-ar 82 | # so we remove the cross compiler tuple altogether 83 | CROSS_COMPILE = 84 | endif 85 | 86 | CC := $(CROSS_COMPILE)gcc 87 | OBJCOPY := $(CROSS_COMPILE)objcopy 88 | CFLAGS += -fno-stack-protector -Wshadow -Wall -Wunused -Werror-implicit-function-declaration 89 | CFLAGS += -I$(GNUEFI_DIR)/inc -I$(GNUEFI_DIR)/inc/$(GNUEFI_ARCH) -I$(GNUEFI_DIR)/inc/protocol 90 | CFLAGS += -DCONFIG_$(GNUEFI_ARCH) -D__MAKEWITH_GNUEFI -DGNU_EFI_USE_MS_ABI 91 | LDFLAGS += -L$(GNUEFI_DIR)/$(GNUEFI_ARCH)/lib -e $(EP_PREFIX)efi_main 92 | LDFLAGS += -s -Wl,-Bsymbolic -nostdlib -shared 93 | LIBS = -lefi $(CRT0_LIBS) 94 | 95 | ifeq (, $(shell which $(CC))) 96 | $(error The selected compiler ($(CC)) was not found) 97 | endif 98 | 99 | GCCVERSION := $(shell $(CC) -dumpversion | cut -f1 -d.) 100 | GCCMINOR := $(shell $(CC) -dumpversion | cut -f2 -d.) 101 | GCCMACHINE := $(shell $(CC) -dumpmachine) 102 | GCCNEWENOUGH := $(shell ( [ $(GCCVERSION) -gt "4" ] \ 103 | || ( [ $(GCCVERSION) -eq "4" ] \ 104 | && [ $(GCCMINOR) -ge "7" ] ) ) \ 105 | && echo 1) 106 | ifneq ($(GCCNEWENOUGH),1) 107 | $(error You need GCC 4.7 or later) 108 | endif 109 | 110 | ifneq ($(GCC_ARCH),$(findstring $(GCC_ARCH), $(GCCMACHINE))) 111 | $(error The selected compiler ($(CC)) is not set for $(ARCH)) 112 | endif 113 | 114 | .PHONY: all clean superclean 115 | all: $(GNUEFI_DIR)/$(GNUEFI_ARCH)/lib/libefi.a native_$(ARCH).efi 116 | 117 | $(GNUEFI_DIR)/$(GNUEFI_ARCH)/lib/libefi.a: 118 | $(MAKE) -C$(GNUEFI_DIR) CROSS_COMPILE=$(CROSS_COMPILE) ARCH=$(GNUEFI_ARCH) $(GNUEFI_LIBS) 119 | 120 | %_$(ARCH).efi: %.o 121 | @echo [LD] $(notdir $@) 122 | ifeq ($(CRT0_LIBS),) 123 | @$(CC) $(LDFLAGS) $< -o $@ $(LIBS) 124 | else 125 | @$(CC) $(LDFLAGS) $< -o $*.elf $(LIBS) 126 | @$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel* \ 127 | -j .rela* -j .reloc -j .eh_frame -O binary $*.elf $@ 128 | @rm -f $*.elf 129 | endif 130 | 131 | %.o: %.c 132 | @echo [CC] $(notdir $@) 133 | @$(CC) $(CFLAGS) -ffreestanding -c $< 134 | 135 | clean: 136 | rm -f *.efi *.o 137 | 138 | superclean: clean 139 | $(MAKE) -C$(GNUEFI_DIR) ARCH=$(GNUEFI_ARCH) clean 140 | rm -f *.fd 141 | -------------------------------------------------------------------------------- /native/native.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/native/native.c -------------------------------------------------------------------------------- /native/native.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.24720.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "native", ".msvc\native.vcxproj", "{DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}" 7 | ProjectSection(ProjectDependencies) = postProject 8 | {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} 9 | EndProjectSection 10 | EndProject 11 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gnu-efi", ".msvc\gnu-efi.vcxproj", "{3135D563-9596-4584-9ED6-616ADEC52974}" 12 | EndProject 13 | Global 14 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 15 | Debug|arm = Debug|arm 16 | Debug|ia32 = Debug|ia32 17 | Debug|x64 = Debug|x64 18 | Release|arm = Release|arm 19 | Release|ia32 = Release|ia32 20 | Release|x64 = Release|x64 21 | EndGlobalSection 22 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 23 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|arm.ActiveCfg = Debug|ARM 24 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|arm.Build.0 = Debug|ARM 25 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|ia32.ActiveCfg = Debug|Win32 26 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|ia32.Build.0 = Debug|Win32 27 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|x64.ActiveCfg = Debug|x64 28 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|x64.Build.0 = Debug|x64 29 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|arm.ActiveCfg = Release|ARM 30 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|arm.Build.0 = Release|ARM 31 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|ia32.ActiveCfg = Release|Win32 32 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|ia32.Build.0 = Release|Win32 33 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|x64.ActiveCfg = Release|x64 34 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|x64.Build.0 = Release|x64 35 | {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|arm.ActiveCfg = Debug|ARM 36 | {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|arm.Build.0 = Debug|ARM 37 | {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|ia32.ActiveCfg = Debug|Win32 38 | {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|ia32.Build.0 = Debug|Win32 39 | {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|x64.ActiveCfg = Debug|x64 40 | {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|x64.Build.0 = Debug|x64 41 | {3135D563-9596-4584-9ED6-616ADEC52974}.Release|arm.ActiveCfg = Release|ARM 42 | {3135D563-9596-4584-9ED6-616ADEC52974}.Release|arm.Build.0 = Release|ARM 43 | {3135D563-9596-4584-9ED6-616ADEC52974}.Release|ia32.ActiveCfg = Release|Win32 44 | {3135D563-9596-4584-9ED6-616ADEC52974}.Release|ia32.Build.0 = Release|Win32 45 | {3135D563-9596-4584-9ED6-616ADEC52974}.Release|x64.ActiveCfg = Release|x64 46 | {3135D563-9596-4584-9ED6-616ADEC52974}.Release|x64.Build.0 = Release|x64 47 | EndGlobalSection 48 | GlobalSection(SolutionProperties) = preSolution 49 | HideSolutionNode = FALSE 50 | EndGlobalSection 51 | EndGlobal 52 | -------------------------------------------------------------------------------- /native/native_aa64.efi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/native/native_aa64.efi -------------------------------------------------------------------------------- /native/native_arm.efi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/native/native_arm.efi -------------------------------------------------------------------------------- /native/native_ia32.efi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/native/native_ia32.efi -------------------------------------------------------------------------------- /native/native_x64.efi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/native/native_x64.efi -------------------------------------------------------------------------------- /printhex.asm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/printhex.asm -------------------------------------------------------------------------------- /protocol.asm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/protocol.asm -------------------------------------------------------------------------------- /protocol_driver/Makefile: -------------------------------------------------------------------------------- 1 | ARCH = x64 2 | # You can alter the subsystem according to your EFI binary target: 3 | # 10 = EFI application 4 | # 11 = EFI boot service driver 5 | # 12 = EFI runtime driver 6 | SUBSYSTEM = 11 7 | 8 | # Try to auto-detect the target ARCH 9 | ifeq ($(shell uname -o),Msys) 10 | IS_MINGW32 = $(findstring MINGW32,$(shell uname -s)) 11 | IS_MINGW64 = $(findstring MINGW64,$(shell uname -s)) 12 | ifeq ($(IS_MINGW32),MINGW32) 13 | ARCH = ia32 14 | endif 15 | ifeq ($(IS_MINGW64),MINGW64) 16 | ARCH = x64 17 | endif 18 | else 19 | ifeq ($(shell uname -m),x86_64) 20 | ARCH = x64 21 | else ifeq ($(shell uname -m),arm) 22 | ARCH = arm 23 | CROSS_COMPILE = 24 | else 25 | ARCH = ia32 26 | endif 27 | endif 28 | 29 | # Auto-detect the host arch for MinGW 30 | ifeq ($(shell uname -m),x86_64) 31 | MINGW_HOST = w64 32 | else 33 | MINGW_HOST = w32 34 | endif 35 | 36 | ifeq ($(ARCH),x64) 37 | GNUEFI_ARCH = x86_64 38 | GCC_ARCH = x86_64 39 | QEMU_ARCH = x86_64 40 | CROSS_COMPILE = $(GCC_ARCH)-$(MINGW_HOST)-mingw32- 41 | EP_PREFIX = 42 | CFLAGS = -m64 -mno-red-zone 43 | LDFLAGS = -Wl,-dll -Wl,--subsystem,$(SUBSYSTEM) 44 | else ifeq ($(ARCH),ia32) 45 | GNUEFI_ARCH = ia32 46 | GCC_ARCH = i686 47 | QEMU_ARCH = i386 48 | CROSS_COMPILE = $(GCC_ARCH)-$(MINGW_HOST)-mingw32- 49 | EP_PREFIX = _ 50 | CFLAGS = -m32 -mno-red-zone 51 | LDFLAGS = -Wl,-dll -Wl,--subsystem,$(SUBSYSTEM) 52 | else ifeq ($(ARCH),arm) 53 | GNUEFI_ARCH = arm 54 | GCC_ARCH = arm 55 | QEMU_ARCH = arm 56 | CROSS_COMPILE = $(GCC_ARCH)-linux-gnueabihf- 57 | EP_PREFIX = 58 | CFLAGS = -marm -fpic -fshort-wchar 59 | LDFLAGS = -Wl,--no-wchar-size-warning -Wl,--defsym=EFI_SUBSYSTEM=$(SUBSYSTEM) 60 | CRT0_LIBS = -lgnuefi 61 | QEMU_OPTS = -M virt -cpu cortex-a15 62 | else ifeq ($(ARCH),aa64) 63 | GNUEFI_ARCH = aarch64 64 | GCC_ARCH = aarch64 65 | QEMU_ARCH = aarch64 66 | CROSS_COMPILE = $(GCC_ARCH)-linux-gnu- 67 | EP_PREFIX = 68 | CFLAGS = -fpic -fshort-wchar 69 | LDFLAGS = -Wl,--no-wchar-size-warning -Wl,--defsym=EFI_SUBSYSTEM=$(SUBSYSTEM) 70 | CRT0_LIBS = -lgnuefi 71 | QEMU_OPTS = -M virt -cpu cortex-a57 72 | endif 73 | OVMF_ARCH = $(shell echo $(ARCH) | tr a-z A-Z) 74 | OVMF_ZIP = OVMF-$(OVMF_ARCH).zip 75 | GNUEFI_DIR = $(CURDIR)/../gnu-efi 76 | GNUEFI_LIBS = lib 77 | 78 | # If the compiler produces an elf binary, we need to fiddle with a PE crt0 79 | ifneq ($(CRT0_LIBS),) 80 | CRT0_DIR = $(GNUEFI_DIR)/$(GNUEFI_ARCH)/gnuefi 81 | LDFLAGS += -L$(CRT0_DIR) -T $(GNUEFI_DIR)/gnuefi/elf_$(GNUEFI_ARCH)_efi.lds $(CRT0_DIR)/crt0-efi-$(GNUEFI_ARCH).o 82 | GNUEFI_LIBS += gnuefi 83 | endif 84 | 85 | # SYSTEMROOT is only defined on Windows systems 86 | ifneq ($(SYSTEMROOT),) 87 | QEMU = "/c/Program Files/qemu/qemu-system-$(QEMU_ARCH)w.exe" 88 | # MinGW on Windows doesn't use (tuple)-ar but (tuple)-gcc-ar 89 | # so we remove the cross compiler tuple altogether 90 | CROSS_COMPILE = 91 | else 92 | QEMU = qemu-system-$(QEMU_ARCH) -nographic 93 | endif 94 | 95 | CC := $(CROSS_COMPILE)gcc 96 | OBJCOPY := $(CROSS_COMPILE)objcopy 97 | CFLAGS += -fno-stack-protector -Wshadow -Wall -Wunused -Werror-implicit-function-declaration 98 | CFLAGS += -I$(GNUEFI_DIR)/inc -I$(GNUEFI_DIR)/inc/$(GNUEFI_ARCH) -I$(GNUEFI_DIR)/inc/protocol 99 | CFLAGS += -DCONFIG_$(GNUEFI_ARCH) -D__MAKEWITH_GNUEFI -DGNU_EFI_USE_MS_ABI 100 | LDFLAGS += -L$(GNUEFI_DIR)/$(GNUEFI_ARCH)/lib -e $(EP_PREFIX)DriverInstall 101 | LDFLAGS += -s -Wl,-Bsymbolic -nostdlib -shared 102 | LIBS = -lefi $(CRT0_LIBS) 103 | 104 | ifeq (, $(shell which $(CC))) 105 | $(error The selected compiler ($(CC)) was not found) 106 | endif 107 | 108 | GCCVERSION := $(shell $(CC) -dumpversion | cut -f1 -d.) 109 | GCCMINOR := $(shell $(CC) -dumpversion | cut -f2 -d.) 110 | GCCMACHINE := $(shell $(CC) -dumpmachine) 111 | GCCNEWENOUGH := $(shell ( [ $(GCCVERSION) -gt "4" ] \ 112 | || ( [ $(GCCVERSION) -eq "4" ] \ 113 | && [ $(GCCMINOR) -ge "7" ] ) ) \ 114 | && echo 1) 115 | ifneq ($(GCCNEWENOUGH),1) 116 | $(error You need GCC 4.7 or later) 117 | endif 118 | 119 | ifneq ($(GCC_ARCH),$(findstring $(GCC_ARCH), $(GCCMACHINE))) 120 | $(error The selected compiler ($(CC)) is not set for $(ARCH)) 121 | endif 122 | 123 | .PHONY: all clean superclean 124 | all: $(GNUEFI_DIR)/$(GNUEFI_ARCH)/lib/libefi.a image/driver_$(ARCH).efi 125 | 126 | $(GNUEFI_DIR)/$(GNUEFI_ARCH)/lib/libefi.a: 127 | $(MAKE) -C$(GNUEFI_DIR) CROSS_COMPILE=$(CROSS_COMPILE) ARCH=$(GNUEFI_ARCH) $(GNUEFI_LIBS) 128 | 129 | %.efi: %.o 130 | @echo [LD] $(notdir $@) 131 | ifeq ($(CRT0_LIBS),) 132 | @$(CC) $(LDFLAGS) $< -o $@ $(LIBS) 133 | else 134 | @$(CC) $(LDFLAGS) $< -o $*.elf $(LIBS) 135 | @$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel* \ 136 | -j .rela* -j .reloc -j .eh_frame -O binary $*.elf $@ 137 | @rm -f $*.elf 138 | endif 139 | 140 | %.o: %.c 141 | @echo [CC] $(notdir $@) 142 | @$(CC) $(CFLAGS) -ffreestanding -c $< 143 | 144 | qemu: CFLAGS += -D_DEBUG 145 | qemu: all OVMF_$(OVMF_ARCH).fd image/driver_$(ARCH).efi 146 | $(QEMU) $(QEMU_OPTS) -bios ./OVMF_$(OVMF_ARCH).fd -net none -hda fat:image 147 | 148 | image/driver_$(ARCH).efi: driver.efi 149 | mkdir -p image/efi/boot 150 | echo 'load fs0:\driver_$(ARCH).efi' > image/efi/boot/startup.nsh 151 | cp -f $< $@ 152 | 153 | OVMF_$(OVMF_ARCH).fd: 154 | wget http://efi.akeo.ie/OVMF/$(OVMF_ZIP) 155 | unzip $(OVMF_ZIP) OVMF.fd 156 | mv OVMF.fd OVMF_$(OVMF_ARCH).fd 157 | rm $(OVMF_ZIP) 158 | 159 | clean: 160 | rm -f driver.efi *.o 161 | rm -rf image 162 | 163 | superclean: clean 164 | $(MAKE) -C$(GNUEFI_DIR) ARCH=$(GNUEFI_ARCH) clean 165 | rm -f *.fd 166 | -------------------------------------------------------------------------------- /protocol_driver/Readme.txt: -------------------------------------------------------------------------------- 1 | This directory contains the drivers used by the protocol.asm sample. 2 | 3 | When loaded, these drivers install a custom protocol, that can be used to 4 | validate EBC to native access, and especially the marshalling of CALLEX 5 | parameters. 6 | 7 | These were compiled from the driver.c source on Debian 8.0 (Sid), 8 | using the included Makefile. Note that you should have initialized the 9 | gnu-efi submodule in the top directory to be able to compile the driver. 10 | -------------------------------------------------------------------------------- /protocol_driver/driver.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/protocol_driver/driver.c -------------------------------------------------------------------------------- /protocol_driver/driver_aa64.efi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/protocol_driver/driver_aa64.efi -------------------------------------------------------------------------------- /protocol_driver/driver_arm.efi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/protocol_driver/driver_arm.efi -------------------------------------------------------------------------------- /protocol_driver/driver_ia32.efi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/protocol_driver/driver_ia32.efi -------------------------------------------------------------------------------- /protocol_driver/driver_x64.efi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/protocol_driver/driver_x64.efi -------------------------------------------------------------------------------- /stack.asm: -------------------------------------------------------------------------------- 1 | ; 2 | ; Stack - Test EBC stack buffer switching 3 | ; Copyright © 2016 Pete Batard - Public Domain 4 | ; 5 | ; Note that, currently, this doesn't work on ANY platform 6 | ; 7 | 8 | include 'ebc.inc' 9 | include 'efi.inc' 10 | include 'format.inc' 11 | include 'utf8.inc' 12 | 13 | format peebc efi 14 | entry EfiMain 15 | 16 | section '.text' code executable readable 17 | EfiMain: 18 | MOV R6, R0 19 | MOVREL R0, StackTop 20 | MOV R0, R6 21 | RET 22 | 23 | section '.data' data readable writeable 24 | StackBuf: dq 255 25 | StackTop: dq 1 26 | -------------------------------------------------------------------------------- /stack_tracker/Readme.txt: -------------------------------------------------------------------------------- 1 | This directory contains the test suite for the ARM EBC Stack Tracker. 2 | See https://github.com/pbatard/edk2/commits/ebc-arm5 3 | 4 | * head.inc/tail.inc contain common code for test preamble and end. 5 | 6 | * cloaked.asm tests stack manipulation using a different register than R0 7 | 8 | * matrix.asm tests the full matrix of natural/64-bit 4 parameters native calls 9 | 10 | * max.asm tests the maximum number of parameters 11 | 12 | * realloc.asm forces a stack tracker reallocation, and tests the stack tracker 13 | performance when large blocks of stack data are set aside and released 14 | 15 | * switch.asm (not run as part of the test suite) is meant to confirm that the 16 | stack tracker can work when the whole stack buffer is switched. This is not 17 | included when running the test suite, as the common code for EBC VM does not 18 | seem to allow such an operation in the first place. 19 | 20 | * shutdown.asm simply shuts down the (virtual) machine after all tests have run. 21 | -------------------------------------------------------------------------------- /stack_tracker/cloaked.asm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/stack_tracker/cloaked.asm -------------------------------------------------------------------------------- /stack_tracker/driver/.msvc/driver.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | ARM 7 | 8 | 9 | Debug 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | ARM 19 | 20 | 21 | Release 22 | Win32 23 | 24 | 25 | Release 26 | x64 27 | 28 | 29 | 30 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE} 31 | driver 32 | 33 | 34 | 35 | Application 36 | true 37 | v140 38 | Unicode 39 | 40 | 41 | Application 42 | true 43 | v140 44 | Unicode 45 | 46 | 47 | Application 48 | true 49 | v140 50 | Unicode 51 | 52 | 53 | Application 54 | false 55 | v140 56 | Unicode 57 | 58 | 59 | Application 60 | false 61 | v140 62 | Unicode 63 | 64 | 65 | Application 66 | false 67 | v140 68 | Unicode 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | .efi 94 | false 95 | false 96 | $(SolutionDir)x64\$(Configuration)\ 97 | $(OutDir)$(ProjectName)\ 98 | 99 | 100 | .efi 101 | false 102 | false 103 | $(SolutionDir)ia32\$(Configuration)\ 104 | $(OutDir)$(ProjectName)\ 105 | 106 | 107 | .efi 108 | false 109 | false 110 | $(SolutionDir)arm\$(Configuration)\ 111 | $(OutDir)$(ProjectName)\ 112 | 113 | 114 | .efi 115 | false 116 | false 117 | $(SolutionDir)x64\$(Configuration)\ 118 | $(OutDir)$(ProjectName)\ 119 | 120 | 121 | .efi 122 | false 123 | false 124 | $(SolutionDir)ia32\$(Configuration)\ 125 | $(OutDir)$(ProjectName)\ 126 | 127 | 128 | .efi 129 | false 130 | false 131 | $(SolutionDir)arm\$(Configuration)\ 132 | $(OutDir)$(ProjectName)\ 133 | 134 | 135 | 136 | $(SolutionDir)\..\..\gnu-efi\inc;$(SolutionDir)\..\..\gnu-efi\inc\x86_64 137 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 138 | false 139 | CompileAsC 140 | Level3 141 | 4091 142 | ProgramDatabase 143 | Default 144 | false 145 | 146 | 147 | EFI Application 148 | 149 | 150 | true 151 | 152 | 153 | gnu-efi.lib;libcmtd.lib;%(AdditionalDependencies) 154 | false 155 | false 156 | true 157 | DriverInstall 158 | EFI Boot Service Driver 159 | $(OutDir);%(AdditionalLibraryDirectories) 160 | true 161 | 162 | 163 | copy $(TargetDir)$(TargetFileName) $(SolutionDir) 164 | 165 | 166 | 167 | 168 | $(SolutionDir)\..\..\gnu-efi\inc;$(SolutionDir)\..\..\gnu-efi\inc\ia32 169 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 170 | false 171 | CompileAsC 172 | Level3 173 | ProgramDatabase 174 | 4091 175 | Default 176 | false 177 | 178 | 179 | EFI Application 180 | 181 | 182 | true 183 | 184 | 185 | gnu-efi.lib;libcmtd.lib;%(AdditionalDependencies) 186 | false 187 | false 188 | true 189 | DriverInstall 190 | EFI Boot Service Driver 191 | $(OutDir);%(AdditionalLibraryDirectories) 192 | true 193 | MachineX86 194 | 195 | 196 | copy $(TargetDir)$(TargetFileName) $(SolutionDir)driver_ia32.efi 197 | 198 | 199 | 200 | 201 | $(SolutionDir)\..\..\gnu-efi\inc;$(SolutionDir)\..\..\gnu-efi\inc\arm 202 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 203 | false 204 | CompileAsC 205 | Level3 206 | ProgramDatabase 207 | 4091 208 | Default 209 | false 210 | 211 | 212 | EFI Application 213 | 214 | 215 | true 216 | 217 | 218 | gnu-efi.lib;libcmtd.lib;%(AdditionalDependencies) 219 | false 220 | true 221 | DriverInstall 222 | EFI Boot Service Driver 223 | $(OutDir);%(AdditionalLibraryDirectories) 224 | true 225 | 226 | 227 | 228 | copy $(TargetDir)$(TargetFileName) $(SolutionDir)driver_arm.efi 229 | 230 | 231 | 232 | 233 | $(SolutionDir)\..\..\gnu-efi\inc;$(SolutionDir)\..\..\gnu-efi\inc\x86_64 234 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 235 | false 236 | CompileAsC 237 | Level3 238 | 4091 239 | false 240 | 241 | 242 | EFI Application 243 | 244 | 245 | true 246 | 247 | 248 | false 249 | 250 | 251 | false 252 | true 253 | DriverInstall 254 | EFI Boot Service Driver 255 | gnu-efi.lib;libcmt.lib;%(AdditionalDependencies) 256 | $(OutDir);%(AdditionalLibraryDirectories) 257 | true 258 | 259 | 260 | copy $(TargetDir)$(TargetFileName) $(SolutionDir) 261 | 262 | 263 | 264 | 265 | $(SolutionDir)\..\..\gnu-efi\inc;$(SolutionDir)\..\..\gnu-efi\inc\ia32 266 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 267 | false 268 | CompileAsC 269 | Level3 270 | 4091 271 | false 272 | 273 | 274 | EFI Application 275 | 276 | 277 | true 278 | 279 | 280 | false 281 | 282 | 283 | false 284 | true 285 | DriverInstall 286 | EFI Boot Service Driver 287 | gnu-efi.lib;libcmt.lib;%(AdditionalDependencies) 288 | $(OutDir);%(AdditionalLibraryDirectories) 289 | true 290 | 291 | 292 | copy $(TargetDir)$(TargetFileName) $(SolutionDir)driver_ia32.efi 293 | 294 | 295 | 296 | 297 | $(SolutionDir)\..\..\gnu-efi\inc;$(SolutionDir)\..\..\gnu-efi\inc\arm 298 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 299 | false 300 | CompileAsC 301 | Level3 302 | 4091 303 | false 304 | 305 | 306 | EFI Application 307 | 308 | 309 | true 310 | 311 | 312 | 313 | false 314 | true 315 | DriverInstall 316 | EFI Boot Service Driver 317 | gnu-efi.lib;libcmt.lib;%(AdditionalDependencies) 318 | $(OutDir);%(AdditionalLibraryDirectories) 319 | true 320 | 321 | 322 | 323 | copy $(TargetDir)$(TargetFileName) $(SolutionDir)driver_arm.efi 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | -------------------------------------------------------------------------------- /stack_tracker/driver/.msvc/driver.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {b1c3b304-e868-4b07-988c-36ad7bc57300} 14 | 15 | 16 | 17 | 18 | Resource Files 19 | 20 | 21 | 22 | 23 | Source Files 24 | 25 | 26 | -------------------------------------------------------------------------------- /stack_tracker/driver/.msvc/driver.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | $(SystemRoot)\System32\wscript 5 | //d debug.vbs "$(TargetPath)" "$(PlatformShortName)" 6 | WindowsLocalDebugger 7 | $(SolutionDir) 8 | 9 | 10 | $(SystemRoot)\System32\wscript 11 | //d debug.vbs "$(TargetPath)" "$(PlatformShortName)" 12 | WindowsLocalDebugger 13 | $(SolutionDir) 14 | 15 | 16 | $(SystemRoot)\System32\wscript 17 | //d debug.vbs "$(TargetPath)" "$(PlatformShortName)" 18 | WindowsLocalDebugger 19 | $(SolutionDir) 20 | 21 | 22 | $(SystemRoot)\System32\wscript 23 | //d debug.vbs "$(TargetPath)" "$(PlatformShortName)" 24 | WindowsLocalDebugger 25 | $(SolutionDir) 26 | 27 | 28 | $(SystemRoot)\System32\wscript 29 | //d debug.vbs "$(TargetPath)" "$(PlatformShortName)" 30 | WindowsLocalDebugger 31 | $(SolutionDir) 32 | 33 | 34 | $(SystemRoot)\System32\wscript 35 | //d debug.vbs "$(TargetPath)" "$(PlatformShortName)" 36 | WindowsLocalDebugger 37 | $(SolutionDir) 38 | 39 | -------------------------------------------------------------------------------- /stack_tracker/driver/.msvc/gnu-efi.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | ARM 7 | 8 | 9 | Debug 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | ARM 19 | 20 | 21 | Release 22 | Win32 23 | 24 | 25 | Release 26 | x64 27 | 28 | 29 | 30 | {3135D563-9596-4584-9ED6-616ADEC52974} 31 | gnuefi 32 | 33 | 34 | 35 | StaticLibrary 36 | true 37 | v140 38 | Unicode 39 | 40 | 41 | StaticLibrary 42 | true 43 | v140 44 | Unicode 45 | 46 | 47 | StaticLibrary 48 | true 49 | v140 50 | Unicode 51 | 52 | 53 | StaticLibrary 54 | false 55 | v140 56 | true 57 | Unicode 58 | 59 | 60 | StaticLibrary 61 | false 62 | v140 63 | true 64 | Unicode 65 | 66 | 67 | StaticLibrary 68 | false 69 | v140 70 | true 71 | Unicode 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | $(SolutionDir)x64\$(Configuration)\ 97 | $(OutDir)$(ProjectName)\ 98 | 99 | 100 | $(SolutionDir)ia32\$(Configuration)\ 101 | $(OutDir)$(ProjectName)\ 102 | 103 | 104 | $(SolutionDir)arm\$(Configuration)\ 105 | $(OutDir)$(ProjectName)\ 106 | 107 | 108 | $(SolutionDir)x64\$(Configuration)\ 109 | $(OutDir)$(ProjectName)\ 110 | 111 | 112 | $(SolutionDir)ia32\$(Configuration)\ 113 | $(OutDir)$(ProjectName)\ 114 | 115 | 116 | $(SolutionDir)arm\$(Configuration)\ 117 | $(OutDir)$(ProjectName)\ 118 | 119 | 120 | 121 | Level3 122 | Disabled 123 | $(SolutionDir)\..\..\gnu-efi\inc;$(SolutionDir)\..\..\gnu-efi\inc\x86_64;$(SolutionDir)\..\..\gnu-efi\inc\protocol;$(SolutionDir)\..\..\gnu-efi\lib 124 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 125 | false 126 | CompileAsC 127 | MultiThreadedDebug 128 | 4312 129 | ProgramDatabase 130 | Default 131 | false 132 | 133 | 134 | true 135 | 136 | 137 | EFI Application 138 | true 139 | 140 | 141 | 142 | 143 | Level3 144 | Disabled 145 | $(SolutionDir)\..\..\gnu-efi\inc;$(SolutionDir)\..\..\gnu-efi\inc\ia32;$(SolutionDir)\..\..\gnu-efi\inc\protocol;$(SolutionDir)\..\..\gnu-efi\lib 146 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 147 | false 148 | CompileAsC 149 | MultiThreadedDebug 150 | ProgramDatabase 151 | 4312 152 | Default 153 | false 154 | 155 | 156 | true 157 | 158 | 159 | EFI Application 160 | true 161 | 162 | 163 | 164 | 165 | Level3 166 | Disabled 167 | $(SolutionDir)\..\..\gnu-efi\inc;$(SolutionDir)\..\..\gnu-efi\inc\arm;$(SolutionDir)\..\..\gnu-efi\inc\protocol;$(SolutionDir)\..\..\gnu-efi\lib 168 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 169 | false 170 | CompileAsC 171 | MultiThreadedDebug 172 | ProgramDatabase 173 | 4312 174 | Default 175 | false 176 | 177 | 178 | true 179 | 180 | 181 | EFI Application 182 | true 183 | 184 | 185 | 186 | 187 | Level3 188 | $(SolutionDir)\..\..\gnu-efi\inc;$(SolutionDir)\..\..\gnu-efi\inc\x86_64;$(SolutionDir)\..\..\gnu-efi\inc\protocol;$(SolutionDir)\..\..\gnu-efi\lib 189 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 190 | false 191 | CompileAsC 192 | MultiThreaded 193 | 4312 194 | false 195 | false 196 | 197 | 198 | true 199 | true 200 | true 201 | 202 | 203 | EFI Application 204 | true 205 | 206 | 207 | 208 | 209 | Level3 210 | $(SolutionDir)\..\..\gnu-efi\inc;$(SolutionDir)\..\..\gnu-efi\inc\ia32;$(SolutionDir)\..\..\gnu-efi\inc\protocol;$(SolutionDir)\..\..\gnu-efi\lib 211 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 212 | false 213 | CompileAsC 214 | MultiThreaded 215 | 4312 216 | false 217 | false 218 | 219 | 220 | true 221 | true 222 | true 223 | 224 | 225 | EFI Application 226 | true 227 | 228 | 229 | 230 | 231 | Level3 232 | $(SolutionDir)\..\..\gnu-efi\inc;$(SolutionDir)\..\..\gnu-efi\inc\arm;$(SolutionDir)\..\..\gnu-efi\inc\protocol;$(SolutionDir)\..\..\gnu-efi\lib 233 | _UNICODE;UNICODE;HAVE_USE_MS_ABI;GNU_EFI_USE_EXTERNAL_STDARG;%(PreprocessorDefinitions) 234 | false 235 | CompileAsC 236 | MultiThreaded 237 | 4312 238 | false 239 | false 240 | 241 | 242 | true 243 | true 244 | true 245 | 246 | 247 | EFI Application 248 | true 249 | 250 | 251 | 252 | 253 | false 254 | false 255 | true 256 | true 257 | true 258 | true 259 | 260 | 261 | true 262 | true 263 | true 264 | true 265 | false 266 | false 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | true 282 | true 283 | true 284 | true 285 | false 286 | false 287 | 288 | 289 | true 290 | true 291 | true 292 | true 293 | false 294 | false 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | true 310 | true 311 | true 312 | true 313 | false 314 | false 315 | 316 | 317 | false 318 | false 319 | true 320 | true 321 | true 322 | true 323 | 324 | 325 | 326 | 327 | 328 | -------------------------------------------------------------------------------- /stack_tracker/driver/.msvc/gnu-efi.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {20c8e9bd-0fa8-46d3-b825-e3eebd64ab3d} 14 | 15 | 16 | {87122940-e80f-416d-a840-5e32f703f3ff} 17 | 18 | 19 | {e6e3d25a-4fce-4036-bef9-3cfbafc4baaf} 20 | 21 | 22 | 23 | 24 | Source Files 25 | 26 | 27 | Source Files 28 | 29 | 30 | Source Files 31 | 32 | 33 | Source Files 34 | 35 | 36 | Source Files 37 | 38 | 39 | Source Files 40 | 41 | 42 | Source Files 43 | 44 | 45 | Source Files 46 | 47 | 48 | Source Files 49 | 50 | 51 | Source Files 52 | 53 | 54 | Source Files 55 | 56 | 57 | Source Files 58 | 59 | 60 | Source Files 61 | 62 | 63 | Source Files 64 | 65 | 66 | Source Files 67 | 68 | 69 | Source Files 70 | 71 | 72 | Source Files 73 | 74 | 75 | Source Files 76 | 77 | 78 | Source Files 79 | 80 | 81 | Source Files 82 | 83 | 84 | Source Files 85 | 86 | 87 | Source Files 88 | 89 | 90 | Source Files 91 | 92 | 93 | Source Files 94 | 95 | 96 | Source Files\arm 97 | 98 | 99 | Source Files\x86_64 100 | 101 | 102 | Source Files\ia32 103 | 104 | 105 | Source Files\x86_64 106 | 107 | 108 | Source Files\ia32 109 | 110 | 111 | Source Files\arm 112 | 113 | 114 | -------------------------------------------------------------------------------- /stack_tracker/driver/.msvc/gnu-efi.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /stack_tracker/driver/Makefile: -------------------------------------------------------------------------------- 1 | ARCH = x64 2 | # You can alter the subsystem according to your EFI binary target: 3 | # 10 = EFI application 4 | # 11 = EFI boot service driver 5 | # 12 = EFI runtime driver 6 | SUBSYSTEM = 11 7 | 8 | # Try to auto-detect the target ARCH 9 | ifeq ($(shell uname -o),Msys) 10 | IS_MINGW32 = $(findstring MINGW32,$(shell uname -s)) 11 | IS_MINGW64 = $(findstring MINGW64,$(shell uname -s)) 12 | ifeq ($(IS_MINGW32),MINGW32) 13 | ARCH = ia32 14 | endif 15 | ifeq ($(IS_MINGW64),MINGW64) 16 | ARCH = x64 17 | endif 18 | else 19 | ifeq ($(shell uname -m),x86_64) 20 | ARCH = x64 21 | else ifeq ($(shell uname -m),arm) 22 | ARCH = arm 23 | CROSS_COMPILE = 24 | else 25 | ARCH = ia32 26 | endif 27 | endif 28 | 29 | # Auto-detect the host arch for MinGW 30 | ifeq ($(shell uname -m),x86_64) 31 | MINGW_HOST = w64 32 | else 33 | MINGW_HOST = w32 34 | endif 35 | 36 | ifeq ($(ARCH),x64) 37 | GNUEFI_ARCH = x86_64 38 | GCC_ARCH = x86_64 39 | QEMU_ARCH = x86_64 40 | CROSS_COMPILE = $(GCC_ARCH)-$(MINGW_HOST)-mingw32- 41 | EP_PREFIX = 42 | CFLAGS = -m64 -mno-red-zone 43 | LDFLAGS = -Wl,-dll -Wl,--subsystem,$(SUBSYSTEM) 44 | else ifeq ($(ARCH),ia32) 45 | GNUEFI_ARCH = ia32 46 | GCC_ARCH = i686 47 | QEMU_ARCH = i386 48 | CROSS_COMPILE = $(GCC_ARCH)-$(MINGW_HOST)-mingw32- 49 | EP_PREFIX = _ 50 | CFLAGS = -m32 -mno-red-zone 51 | LDFLAGS = -Wl,-dll -Wl,--subsystem,$(SUBSYSTEM) 52 | else ifeq ($(ARCH),arm) 53 | GNUEFI_ARCH = arm 54 | GCC_ARCH = arm 55 | QEMU_ARCH = arm 56 | CROSS_COMPILE = $(GCC_ARCH)-linux-gnueabihf- 57 | EP_PREFIX = 58 | CFLAGS = -marm -fpic -fshort-wchar 59 | LDFLAGS = -Wl,--no-wchar-size-warning -Wl,--defsym=EFI_SUBSYSTEM=$(SUBSYSTEM) 60 | CRT0_LIBS = -lgnuefi 61 | QEMU_OPTS = -M virt -cpu cortex-a15 62 | else ifeq ($(ARCH),aa64) 63 | GNUEFI_ARCH = aarch64 64 | GCC_ARCH = aarch64 65 | QEMU_ARCH = aarch64 66 | CROSS_COMPILE = $(GCC_ARCH)-linux-gnu- 67 | EP_PREFIX = 68 | CFLAGS = -fpic -fshort-wchar 69 | LDFLAGS = -Wl,--no-wchar-size-warning -Wl,--defsym=EFI_SUBSYSTEM=$(SUBSYSTEM) 70 | CRT0_LIBS = -lgnuefi 71 | QEMU_OPTS = -M virt -cpu cortex-a57 72 | endif 73 | OVMF_ARCH = $(shell echo $(ARCH) | tr a-z A-Z) 74 | OVMF_ZIP = OVMF-$(OVMF_ARCH).zip 75 | GNUEFI_DIR = $(CURDIR)/gnu-efi 76 | GNUEFI_LIBS = lib 77 | 78 | # If the compiler produces an elf binary, we need to fiddle with a PE crt0 79 | ifneq ($(CRT0_LIBS),) 80 | CRT0_DIR = $(GNUEFI_DIR)/$(GNUEFI_ARCH)/gnuefi 81 | LDFLAGS += -L$(CRT0_DIR) -T $(GNUEFI_DIR)/gnuefi/elf_$(GNUEFI_ARCH)_efi.lds $(CRT0_DIR)/crt0-efi-$(GNUEFI_ARCH).o 82 | GNUEFI_LIBS += gnuefi 83 | endif 84 | 85 | # SYSTEMROOT is only defined on Windows systems 86 | ifneq ($(SYSTEMROOT),) 87 | QEMU = "/c/Program Files/qemu/qemu-system-$(QEMU_ARCH)w.exe" 88 | # MinGW on Windows doesn't use (tuple)-ar but (tuple)-gcc-ar 89 | # so we remove the cross compiler tuple altogether 90 | CROSS_COMPILE = 91 | else 92 | QEMU = qemu-system-$(QEMU_ARCH) -nographic 93 | endif 94 | 95 | CC := $(CROSS_COMPILE)gcc 96 | OBJCOPY := $(CROSS_COMPILE)objcopy 97 | CFLAGS += -fno-stack-protector -Wshadow -Wall -Wunused -Werror-implicit-function-declaration 98 | CFLAGS += -I$(GNUEFI_DIR)/inc -I$(GNUEFI_DIR)/inc/$(GNUEFI_ARCH) -I$(GNUEFI_DIR)/inc/protocol 99 | CFLAGS += -DCONFIG_$(GNUEFI_ARCH) -D__MAKEWITH_GNUEFI -DGNU_EFI_USE_MS_ABI 100 | LDFLAGS += -L$(GNUEFI_DIR)/$(GNUEFI_ARCH)/lib -e $(EP_PREFIX)DriverInstall 101 | LDFLAGS += -s -Wl,-Bsymbolic -nostdlib -shared 102 | LIBS = -lefi $(CRT0_LIBS) 103 | 104 | ifeq (, $(shell which $(CC))) 105 | $(error The selected compiler ($(CC)) was not found) 106 | endif 107 | 108 | GCCVERSION := $(shell $(CC) -dumpversion | cut -f1 -d.) 109 | GCCMINOR := $(shell $(CC) -dumpversion | cut -f2 -d.) 110 | GCCMACHINE := $(shell $(CC) -dumpmachine) 111 | GCCNEWENOUGH := $(shell ( [ $(GCCVERSION) -gt "4" ] \ 112 | || ( [ $(GCCVERSION) -eq "4" ] \ 113 | && [ $(GCCMINOR) -ge "7" ] ) ) \ 114 | && echo 1) 115 | ifneq ($(GCCNEWENOUGH),1) 116 | $(error You need GCC 4.7 or later) 117 | endif 118 | 119 | ifneq ($(GCC_ARCH),$(findstring $(GCC_ARCH), $(GCCMACHINE))) 120 | $(error The selected compiler ($(CC)) is not set for $(ARCH)) 121 | endif 122 | 123 | .PHONY: all clean superclean 124 | all: $(GNUEFI_DIR)/$(GNUEFI_ARCH)/lib/libefi.a image/driver_$(ARCH).efi 125 | 126 | $(GNUEFI_DIR)/$(GNUEFI_ARCH)/lib/libefi.a: 127 | $(MAKE) -C$(GNUEFI_DIR) CROSS_COMPILE=$(CROSS_COMPILE) ARCH=$(GNUEFI_ARCH) $(GNUEFI_LIBS) 128 | 129 | %.efi: %.o 130 | @echo [LD] $(notdir $@) 131 | ifeq ($(CRT0_LIBS),) 132 | @$(CC) $(LDFLAGS) $< -o $@ $(LIBS) 133 | else 134 | @$(CC) $(LDFLAGS) $< -o $*.elf $(LIBS) 135 | @$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel* \ 136 | -j .rela* -j .reloc -j .eh_frame -O binary $*.elf $@ 137 | @rm -f $*.elf 138 | endif 139 | 140 | %.o: %.c 141 | @echo [CC] $(notdir $@) 142 | @$(CC) $(CFLAGS) -ffreestanding -c $< 143 | 144 | qemu: CFLAGS += -D_DEBUG 145 | qemu: all OVMF_$(OVMF_ARCH).fd image/driver_$(ARCH).efi 146 | $(QEMU) $(QEMU_OPTS) -bios ./OVMF_$(OVMF_ARCH).fd -net none -hda fat:image 147 | 148 | image/driver_$(ARCH).efi: driver.efi 149 | mkdir -p image/efi/boot 150 | echo 'load fs0:\driver_$(ARCH).efi' > image/efi/boot/startup.nsh 151 | cp -f $< $@ 152 | 153 | OVMF_$(OVMF_ARCH).fd: 154 | wget http://efi.akeo.ie/OVMF/$(OVMF_ZIP) 155 | unzip $(OVMF_ZIP) OVMF.fd 156 | mv OVMF.fd OVMF_$(OVMF_ARCH).fd 157 | rm $(OVMF_ZIP) 158 | 159 | clean: 160 | rm -f driver.efi *.o 161 | rm -rf image 162 | 163 | superclean: clean 164 | $(MAKE) -C$(GNUEFI_DIR) ARCH=$(GNUEFI_ARCH) clean 165 | rm -f *.fd 166 | -------------------------------------------------------------------------------- /stack_tracker/driver/Readme.txt: -------------------------------------------------------------------------------- 1 | This directory contains the driver used by the Arm EBC stack tracker test suite. 2 | 3 | An Arm toolchain as well as the gnu-efi git submodule are required for compilation. 4 | 5 | Note that, to enable Arm compilation from Visual Studio 2015, you should: 6 | - Make sure Visual Studio is fully closed. 7 | - Navigate to C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Platforms\ARM 8 | and remove the read-only attribute on Platform.Common.props. 9 | - Using a text editor running with Administrative privileges open: 10 | C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Platforms\ARM\Platform.Common.props 11 | - Under the section add the following: 12 | true 13 | -------------------------------------------------------------------------------- /stack_tracker/driver/driver.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/stack_tracker/driver/driver.c -------------------------------------------------------------------------------- /stack_tracker/driver/driver.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.24720.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "driver", ".msvc\driver.vcxproj", "{DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}" 7 | ProjectSection(ProjectDependencies) = postProject 8 | {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} 9 | EndProjectSection 10 | EndProject 11 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gnu-efi", ".msvc\gnu-efi.vcxproj", "{3135D563-9596-4584-9ED6-616ADEC52974}" 12 | EndProject 13 | Global 14 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 15 | Debug|arm = Debug|arm 16 | Debug|ia32 = Debug|ia32 17 | Debug|x64 = Debug|x64 18 | Release|arm = Release|arm 19 | Release|ia32 = Release|ia32 20 | Release|x64 = Release|x64 21 | EndGlobalSection 22 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 23 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|arm.ActiveCfg = Debug|ARM 24 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|arm.Build.0 = Debug|ARM 25 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|ia32.ActiveCfg = Debug|Win32 26 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|ia32.Build.0 = Debug|Win32 27 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|x64.ActiveCfg = Debug|x64 28 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|x64.Build.0 = Debug|x64 29 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|arm.ActiveCfg = Release|ARM 30 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|arm.Build.0 = Release|ARM 31 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|ia32.ActiveCfg = Release|Win32 32 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|ia32.Build.0 = Release|Win32 33 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|x64.ActiveCfg = Release|x64 34 | {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|x64.Build.0 = Release|x64 35 | {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|arm.ActiveCfg = Debug|ARM 36 | {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|arm.Build.0 = Debug|ARM 37 | {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|ia32.ActiveCfg = Debug|Win32 38 | {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|ia32.Build.0 = Debug|Win32 39 | {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|x64.ActiveCfg = Debug|x64 40 | {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|x64.Build.0 = Debug|x64 41 | {3135D563-9596-4584-9ED6-616ADEC52974}.Release|arm.ActiveCfg = Release|ARM 42 | {3135D563-9596-4584-9ED6-616ADEC52974}.Release|arm.Build.0 = Release|ARM 43 | {3135D563-9596-4584-9ED6-616ADEC52974}.Release|ia32.ActiveCfg = Release|Win32 44 | {3135D563-9596-4584-9ED6-616ADEC52974}.Release|ia32.Build.0 = Release|Win32 45 | {3135D563-9596-4584-9ED6-616ADEC52974}.Release|x64.ActiveCfg = Release|x64 46 | {3135D563-9596-4584-9ED6-616ADEC52974}.Release|x64.Build.0 = Release|x64 47 | EndGlobalSection 48 | GlobalSection(SolutionProperties) = preSolution 49 | HideSolutionNode = FALSE 50 | EndGlobalSection 51 | EndGlobal 52 | -------------------------------------------------------------------------------- /stack_tracker/driver/driver_arm.efi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/stack_tracker/driver/driver_arm.efi -------------------------------------------------------------------------------- /stack_tracker/driver/driver_ia32.efi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/stack_tracker/driver/driver_ia32.efi -------------------------------------------------------------------------------- /stack_tracker/head.inc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/stack_tracker/head.inc -------------------------------------------------------------------------------- /stack_tracker/make.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | setlocal EnableDelayedExpansion 3 | set include=..\include 4 | 5 | set FILE_LIST=matrix max cloaked realloc shutdown 6 | set UEFI_EXT=arm 7 | set QEMU_ARCH=arm 8 | set QEMU_PATH=C:\Program Files\qemu\ 9 | set QEMU_OPTS=-net none -monitor none -parallel none 10 | set FIRMWARE_BASENAME=QEMU_EFI 11 | set RUN_QEMU= 12 | set COPY_SRC= 13 | 14 | :loop 15 | if [%1]==[] goto next 16 | if [%1]==[qemu] ( 17 | if not exist "%QEMU_PATH%" ( 18 | echo %QEMU_PATH% is missing! 19 | goto end 20 | ) 21 | set RUN_QEMU=1 22 | ) else if [%1]==[ia32] ( 23 | set UEFI_EXT=ia32 24 | set QEMU_ARCH=i386 25 | set FIRMWARE_BASENAME=OVMF 26 | ) else if [%1]==[serial] ( 27 | set QEMU_OPTS=%QEMU_OPTS% -serial file:serial_%UEFI_EXT%.log 28 | ) else if [%1]==[copy] ( 29 | set COPY_SRC=\\vm-debian\src\edk2\Build\ArmVirtQemu-ARM\RELEASE_GCC5\FV\QEMU_EFI.fd 30 | ) else ( 31 | set FILE=%1 32 | if not exist "%1.asm" ( 33 | echo %1.asm does not exist! 34 | goto end 35 | ) 36 | ) 37 | shift 38 | goto loop 39 | 40 | :next 41 | if not exist fasmg.exe ( 42 | call cscript /nologo "%~dp0\..\download.vbs" https://flatassembler.net fasmg.zip fasmg.exe fasmg.exe "The latest fasmg assembler" 43 | if errorlevel 1 goto end 44 | echo. 45 | ) 46 | 47 | for %%f in (%FILE_LIST%) do ( 48 | echo fasmg %%f.asm %%f.efi 49 | fasmg %%f.asm %%f.efi 50 | if errorlevel 1 goto end 51 | ) 52 | 53 | if [%RUN_QEMU%]==[] goto end 54 | 55 | if [%QEMU_ARCH%]==[arm] set QEMU_OPTS=-M virt -cpu cortex-a15 %QEMU_OPTS% 56 | 57 | set UEFI_EXT_UPPERCASE=ARM 58 | if [%UEFI_EXT%]==[ia32] ( 59 | set UEFI_EXT_UPPERCASE=IA32 60 | ) 61 | 62 | set QEMU_FIRMWARE=%FIRMWARE_BASENAME%_%UEFI_EXT_UPPERCASE%.fd 63 | set QEMU_EXE=qemu-system-%QEMU_ARCH%w.exe 64 | set ZIP_FILE=%FIRMWARE_BASENAME%-%UEFI_EXT_UPPERCASE%.zip 65 | if not [%COPY_SRC%]==[] ( 66 | echo Copy %COPY_SRC% to %QEMU_FIRMWARE% 67 | copy %COPY_SRC% %QEMU_FIRMWARE% 68 | ) else if not exist %QEMU_FIRMWARE% ( 69 | call cscript /nologo "%~dp0\..\download.vbs" http://efi.akeo.ie/%FIRMWARE_BASENAME% %ZIP_FILE% %FIRMWARE_BASENAME%.fd %QEMU_FIRMWARE% "The UEFI firmware file, needed for QEMU," 70 | if errorlevel 1 goto end 71 | ) 72 | 73 | if not exist image\efi\boot mkdir image\efi\boot 74 | del image\efi\boot\boot*.efi > NUL 2>&1 75 | del image\efi\boot\startup.nsh > NUL 2>&1 76 | 77 | for %%f in (%FILE_LIST%) do ( 78 | copy %%f.efi image\%%f.efi >NUL 79 | ) 80 | copy driver\driver_%UEFI_EXT%.efi image > NUL 81 | echo fs0: > image\efi\boot\startup.nsh 82 | echo load driver_%UEFI_EXT%.efi >> image\efi\boot\startup.nsh 83 | for %%f in (%FILE_LIST%) do ( 84 | echo %%f.efi >> image\efi\boot\startup.nsh 85 | ) 86 | 87 | echo %QEMU_EXE% %QEMU_OPTS% -L . -bios %QEMU_FIRMWARE% -hda fat:image 88 | "%QEMU_PATH%%QEMU_EXE%" %QEMU_OPTS% -L . -bios %QEMU_FIRMWARE% -hda fat:image 89 | del /q trace-* >NUL 2>&1 90 | 91 | :end 92 | -------------------------------------------------------------------------------- /stack_tracker/matrix.asm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/stack_tracker/matrix.asm -------------------------------------------------------------------------------- /stack_tracker/max.asm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/stack_tracker/max.asm -------------------------------------------------------------------------------- /stack_tracker/realloc.asm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/stack_tracker/realloc.asm -------------------------------------------------------------------------------- /stack_tracker/shutdown.asm: -------------------------------------------------------------------------------- 1 | ; 2 | ; shutdown machine on keypress 3 | ; Copyright © 2016 Pete Batard - Public Domain 4 | ; 5 | 6 | include 'ebc.inc' 7 | include 'efi.inc' 8 | include 'format.inc' 9 | include 'utf8.inc' 10 | 11 | format peebc efi 12 | entry EfiMain 13 | 14 | section '.text' code executable readable 15 | EfiMain: 16 | MOVn R1, @R0(EFI_MAIN_PARAMETERS.SystemTable) 17 | MOVn R1, @R1(EFI_SYSTEM_TABLE.ConOut) 18 | MOVREL R2, Message 19 | PUSHn R2 20 | PUSHn R1 21 | CALLEX @R1(SIMPLE_TEXT_OUTPUT_INTERFACE.OutputString) 22 | MOV R0, R0(+2,0) 23 | 24 | MOVn R1, @R0(EFI_MAIN_PARAMETERS.SystemTable) 25 | MOVn R1, @R1(EFI_SYSTEM_TABLE.ConIn) 26 | MOVI R2, FALSE 27 | PUSHn R2 28 | PUSHn R1 29 | CALLEX @R1(SIMPLE_TEXT_INPUT_INTERFACE.Reset) 30 | POPn R1 31 | POPn R2 32 | 33 | MOVn R3, @R0(EFI_MAIN_PARAMETERS.SystemTable) 34 | MOVn R3, @R3(EFI_SYSTEM_TABLE.BootServices) 35 | MOVREL R2, Event 36 | PUSHn R2 37 | MOV R1, R1(SIMPLE_TEXT_INPUT_INTERFACE.WaitForKey) 38 | PUSHn R1 39 | MOVI R1, 1 40 | PUSHn R1 41 | CALLEX @R3(EFI_BOOT_SERVICES.WaitForEvent) 42 | MOV R0, R0(+3,0) 43 | 44 | MOVn R6, @R0(EFI_MAIN_PARAMETERS.SystemTable) 45 | MOVn R6, @R6(EFI_SYSTEM_TABLE.RuntimeServices) 46 | MOVI R1, EfiResetShutdown 47 | MOVI R2, EFI_SUCCESS 48 | MOVI R3, 0 49 | PUSHn R3 50 | PUSHn R3 51 | PUSHn R2 52 | PUSHn R1 53 | CALLEX @R6(EFI_RUNTIME_SERVICES.ResetSystem) 54 | MOV R0, R0(+4,0) 55 | RET 56 | 57 | section '.data' data readable writeable 58 | Event: dq ? 59 | Message: du 0x0D, 0x0A 60 | du "Press any key to exit", 0x0D, 0x0A 61 | du 0x00 62 | -------------------------------------------------------------------------------- /stack_tracker/switch.asm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/stack_tracker/switch.asm -------------------------------------------------------------------------------- /stack_tracker/tail.inc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pbatard/fasmg-ebc/ba44720d3578ae4b18546146d436666a84f02590/stack_tracker/tail.inc --------------------------------------------------------------------------------