mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-12 05:59:10 +00:00
Add UEFI support
This is mutually exclusive with Windows support. Documentation for how to use it has been written in libc/runtime/efimain.c
This commit is contained in:
parent
c6c9b5dfde
commit
537c21338b
24 changed files with 1381 additions and 391 deletions
72
libc/runtime/efimain.c
Normal file
72
libc/runtime/efimain.c
Normal file
|
@ -0,0 +1,72 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/efi.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/nt/efi.h"
|
||||
#include "libc/nt/thunk/msabi.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
|
||||
/**
|
||||
* EFI Application Entrypoint.
|
||||
*
|
||||
* This entrypoint is mutually exclusive from WinMain since
|
||||
* Windows apps and EFI apps use the same PE binary format.
|
||||
* By default, we build binaries to support Windows. If you
|
||||
* want to your APE executable to boot on UEFI instead then
|
||||
* you need to run the following build command:
|
||||
*
|
||||
* make -j8 CPPFLAGS=-DSUPPORT_VECTOR=251
|
||||
*
|
||||
* That'll remove all the Windows code and turn EFI on. You
|
||||
* can also remove by BIOS code too, by changing 251 to 249
|
||||
* but it shouldn't matter. Here's how to emulate EFI apps:
|
||||
*
|
||||
* qemu-system-x86_64 \
|
||||
* -bios OVMF.fd \
|
||||
* -serial stdio \
|
||||
* -net none \
|
||||
* -drive format=raw,file=fat:rw:o/tool/viz
|
||||
* FS0:
|
||||
* deathstar.com
|
||||
*
|
||||
* If you're using the amalgamated release binaries then it
|
||||
* should be possible to enable UEFI mode by having this at
|
||||
* the top of your main source file to hint the APE linker:
|
||||
*
|
||||
* STATIC_YOINK("EfiMain");
|
||||
* int main() { ... }
|
||||
*
|
||||
* @see libc/dce.h
|
||||
*/
|
||||
__msabi noasan EFI_STATUS EfiMain(EFI_HANDLE ImageHandle,
|
||||
EFI_SYSTEM_TABLE *SystemTable) {
|
||||
extern char os asm("__hostos");
|
||||
os = UEFI;
|
||||
__efi_image_handle = ImageHandle;
|
||||
__efi_system_table = SystemTable;
|
||||
asm("push\t$0\n\t"
|
||||
"push\t$0\n\t"
|
||||
"push\t$0\n\t"
|
||||
"push\t$0\n\t"
|
||||
"push\t$0\n\t"
|
||||
"xor\t%edi,%edi\n\t"
|
||||
".weak\t_start\n\t"
|
||||
"jmp\t_start");
|
||||
unreachable;
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│
|
||||
│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│
|
||||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
|
@ -16,15 +16,16 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/macros.h"
|
||||
.privileged
|
||||
.source __FILE__
|
||||
#include "libc/runtime/runtime.h"
|
||||
|
||||
// Terminates process, ignoring destructors and atexit() handlers.
|
||||
//
|
||||
// @param edi is exit code ∈ [0,256)
|
||||
// @asyncsignalsafe
|
||||
// @vforksafe
|
||||
// @noreturn
|
||||
_exit: jmp _Exit
|
||||
.endfn _exit,globl,protected
|
||||
/**
|
||||
* Terminates process, ignoring destructors and atexit() handlers.
|
||||
*
|
||||
* @param rc is exit code ∈ [0,256)
|
||||
* @asyncsignalsafe
|
||||
* @vforksafe
|
||||
* @noreturn
|
||||
*/
|
||||
wontreturn void _exit(int rc) {
|
||||
_Exit(rc);
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│
|
||||
│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│
|
||||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
|
@ -16,30 +16,29 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/efi.h"
|
||||
#include "libc/calls/internal.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/runtime/internal.h"
|
||||
#include "libc/macros.h"
|
||||
.privileged
|
||||
#include "libc/nexgen32e/vendor.internal.h"
|
||||
#include "libc/nt/runtime.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
|
||||
// Terminates process, ignoring destructors and atexit() handlers.
|
||||
//
|
||||
// @param edi is exit code ∈ [0,256)
|
||||
// @asyncsignalsafe
|
||||
// @vforksafe
|
||||
// @noreturn
|
||||
_Exit: push %rbp
|
||||
mov %rsp,%rbp
|
||||
#if SupportsWindows()
|
||||
testb IsWindows()
|
||||
jz 1f
|
||||
sub $32,%rsp
|
||||
movzbl %dil,%ecx # %ERRORLEVEL% is limitless
|
||||
call *__imp_ExitProcess(%rip)
|
||||
#endif
|
||||
1: mov __NR_exit_group(%rip),%eax
|
||||
syscall
|
||||
#if SupportsMetal()
|
||||
call triplf
|
||||
#endif
|
||||
.endfn _Exit,globl,protected
|
||||
.hidden __NR_exit_group
|
||||
/**
|
||||
* Terminates process, ignoring destructors and atexit() handlers.
|
||||
*
|
||||
* @param rc is exit code ∈ [0,256)
|
||||
* @asyncsignalsafe
|
||||
* @vforksafe
|
||||
* @noreturn
|
||||
*/
|
||||
wontreturn void _Exit(int rc) {
|
||||
if ((!IsWindows() && !IsMetal() && !IsUefi()) ||
|
||||
(IsMetal() && IsGenuineCosmo())) {
|
||||
sys_exit(rc);
|
||||
} else if (IsUefi()) {
|
||||
__efi_system_table->BootServices->Exit(__efi_image_handle, rc, 0, NULL);
|
||||
} else if (IsWindows()) {
|
||||
ExitProcess(rc & 0xff);
|
||||
}
|
||||
triplf();
|
||||
}
|
|
@ -73,12 +73,6 @@ void *sbrk(intptr_t);
|
|||
int brk(void *);
|
||||
int NtGetVersion(void);
|
||||
|
||||
/*───────────────────────────────────────────────────────────────────────────│─╗
|
||||
│ cosmopolitan § runtime » optimizations ─╬─│┼
|
||||
╚────────────────────────────────────────────────────────────────────────────│*/
|
||||
|
||||
#define _exit(RC) _Exit(RC)
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
#endif /* COSMOPOLITAN_LIBC_RUNTIME_RUNTIME_H_ */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue