main: refactor to keep the EFI headers from polluting the main namespace
This commit is contained in:
parent
e2a2679f6d
commit
4460661bfd
19
efimain.h
Normal file
19
efimain.h
Normal file
@ -0,0 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#include "stddef.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#include <efi.h>
|
||||
}
|
||||
#else
|
||||
#include <efi.h>
|
||||
#endif
|
||||
|
||||
|
||||
extern EFI_HANDLE efiImageHandle;
|
||||
extern EFI_SYSTEM_TABLE * efiSystemTable;
|
||||
extern EFI_BOOT_SERVICES *efiBootServices;
|
||||
|
||||
extern SIMPLE_TEXT_OUTPUT_INTERFACE *efiStdout, *efiStderr;
|
||||
extern SIMPLE_INPUT_INTERFACE * efiStdin;
|
@ -9,6 +9,7 @@
|
||||
#include "../runtime/stdio.h"
|
||||
#include "../util/minmax.h"
|
||||
#include "../util/stack.h"
|
||||
#include "../efimain.h"
|
||||
#include <efiprot.h>
|
||||
|
||||
#include <assert.h>
|
||||
|
@ -1,7 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "../main.h"
|
||||
#include "efiprot.h"
|
||||
|
||||
#include "color.h"
|
||||
#include "xcursor/xcursor.h"
|
||||
@ -14,12 +13,16 @@ extern "C" {
|
||||
#define HELOS_GRAPHICS_TARGET_MODE_WIDTH 1600
|
||||
#define HELOS_GRAPHICS_TARGET_MODE_HEIGHT 900
|
||||
|
||||
typedef enum {
|
||||
graphics_PixelFormat_RGBA_8bit,
|
||||
graphics_PixelFormat_BGRA_8bit,
|
||||
} graphics_PixelFormat;
|
||||
|
||||
typedef struct {
|
||||
int Width, Height;
|
||||
int PixelsPerLine;
|
||||
|
||||
EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;
|
||||
graphics_PixelFormat PixelFormat;
|
||||
} HelosGraphics_Mode;
|
||||
|
||||
|
||||
@ -48,9 +51,9 @@ void graphics_SetPixel_BGR(int posX, int posY, const HelosGraphics_Color *color)
|
||||
|
||||
// graphics_SetPixel calls one of SetPixel_RGB/BGR according to the framebuffer format.
|
||||
static inline void graphics_SetPixel(int posX, int posY, const HelosGraphics_Color *color) {
|
||||
if (graphics_SystemVideoMode.PixelFormat == PixelBlueGreenRedReserved8BitPerColor)
|
||||
if (graphics_SystemVideoMode.PixelFormat == graphics_PixelFormat_BGRA_8bit)
|
||||
graphics_SetPixel_BGR(posX, posY, color);
|
||||
else if (graphics_SystemVideoMode.PixelFormat == PixelRedGreenBlueReserved8BitPerColor)
|
||||
else if (graphics_SystemVideoMode.PixelFormat == graphics_PixelFormat_RGBA_8bit)
|
||||
graphics_SetPixel_RGB(posX, posY, color);
|
||||
}
|
||||
|
||||
|
2
main.c
2
main.c
@ -1,5 +1,6 @@
|
||||
|
||||
#include "main.h"
|
||||
#include "efimain.h"
|
||||
|
||||
#include <string.h>
|
||||
#include "runtime/panic_assert.h"
|
||||
@ -28,7 +29,6 @@ FASTCALL_ABI EFI_STATUS efiMain(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *System
|
||||
io_WriteConsole(" Welcome to " PROJECT_NAME " !\r\n\r\n");
|
||||
|
||||
graphics_Init();
|
||||
io_PauseForKeystroke();
|
||||
|
||||
graphics_ClearBuffer(&HelosGraphics_Color_Black);
|
||||
graphics_FillPixel(0, 0, 20, 20, &HelosGraphics_Color_Black);
|
||||
|
20
main.h
20
main.h
@ -1,14 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "stddef.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#include <efi.h>
|
||||
}
|
||||
#else
|
||||
#include <efi.h>
|
||||
#endif
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define PROJECT_NAME "Helos1"
|
||||
#define PROJECT_NAME_LONG L"Helos1"
|
||||
@ -33,15 +26,8 @@ extern "C" {
|
||||
: "=r"(var))
|
||||
|
||||
|
||||
extern EFI_HANDLE efiImageHandle;
|
||||
extern EFI_SYSTEM_TABLE * efiSystemTable;
|
||||
extern EFI_BOOT_SERVICES *efiBootServices;
|
||||
|
||||
extern SIMPLE_TEXT_OUTPUT_INTERFACE *efiStdout, *efiStderr;
|
||||
extern SIMPLE_INPUT_INTERFACE * efiStdin;
|
||||
|
||||
#define HELOS_BUFFER_SIZE 16384
|
||||
extern char Buffer[HELOS_BUFFER_SIZE] ALIGN(4096); // general-purpose buffer, user saved (volatile), not used in interrupt handlers
|
||||
extern char Buffer[HELOS_BUFFER_SIZE] ALIGNED(4096); // general-purpose buffer, user saved (volatile), not used in interrupt handlers
|
||||
|
||||
|
||||
extern const char link_TextStart[], link_TextEnd[];
|
||||
|
@ -1,5 +1,6 @@
|
||||
|
||||
#include "../main.h"
|
||||
#include "../efimain.h"
|
||||
#include "memory.h"
|
||||
#include "../runtime/stdio.h"
|
||||
#include "../extlib/dlmalloc/malloc-2.8.6.h"
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include "../main.h"
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
@ -43,9 +44,6 @@ static inline uint64_t paging_MapFunction(void *func) {
|
||||
}
|
||||
|
||||
|
||||
// efiMallocTyped allocates from EFI_BOOT_SERVICES.AllocatePool.
|
||||
void *efiMallocTyped(size_t size, EFI_MEMORY_TYPE type);
|
||||
|
||||
// efiMallocTyped allocates from EFI_BOOT_SERVICES.AllocatePool
|
||||
// with a memory type of EfiLoaderData.
|
||||
void *efiMalloc(size_t size);
|
||||
@ -61,12 +59,6 @@ void *kMalloc(size_t size);
|
||||
void kFree(void *data);
|
||||
|
||||
|
||||
extern EFI_MEMORY_DESCRIPTOR *efiMemoryMap;
|
||||
extern UINTN efiMemoryMapSize;
|
||||
extern UINTN efiMemoryMapKey;
|
||||
extern UINTN efiDescriptorSize;
|
||||
extern UINT32 efiDescriptorVertion;
|
||||
|
||||
// runtime_InitPaging initializes paging and kMalloc/kFree allocator.
|
||||
// This function calls ExitBootServices()!!! which is great
|
||||
// Furthermore, it sets up a new stack, calls kMain() and does not return.
|
||||
|
11
memory/memory_internal.h
Normal file
11
memory/memory_internal.h
Normal file
@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
#include "memory.h"
|
||||
#include "../efimain.h"
|
||||
|
||||
|
||||
extern EFI_MEMORY_DESCRIPTOR *efiMemoryMap;
|
||||
extern UINTN efiMemoryMapSize;
|
||||
extern UINTN efiMemoryMapKey;
|
||||
extern UINTN efiDescriptorSize;
|
||||
extern UINT32 efiDescriptorVertion;
|
@ -1,5 +1,6 @@
|
||||
|
||||
#include "../main.h"
|
||||
#include "../efimain.h"
|
||||
#include "memory.h"
|
||||
#include "../runtime/panic_assert.h"
|
||||
#include "../runtime/stdio.h"
|
||||
@ -13,6 +14,7 @@ void execformat_pe_ReadSystemHeader(execformat_pe_PortableExecutable *pe);
|
||||
#include <string.h>
|
||||
|
||||
#include "paging_internal.h"
|
||||
#include "paging_internal_efi.h"
|
||||
|
||||
|
||||
EFI_MEMORY_DESCRIPTOR *efiMemoryMap;
|
||||
@ -111,7 +113,6 @@ void runtime_InitPaging() {
|
||||
paging_UsableBytes / 1024.0 / 1024.0,
|
||||
paging_UsableBytes / 1024.0 / 1024.0 / 1024.0);
|
||||
|
||||
io_PauseForKeystroke();
|
||||
|
||||
assert(paging_LoaderCodeAddress && "EfiLoaderCode mapping not found");
|
||||
|
||||
|
@ -9,13 +9,6 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
// defined in paging_init.c
|
||||
extern EFI_MEMORY_DESCRIPTOR *efiMemoryMap;
|
||||
extern UINTN efiMemoryMapSize;
|
||||
extern UINTN efiMemoryMapKey;
|
||||
extern UINTN efiDescriptorSize;
|
||||
extern UINT32 efiDescriptorVertion;
|
||||
|
||||
// defined in paging_init.c
|
||||
extern uint64_t paging_TotalBytes, paging_UsableBytes;
|
||||
extern bool paging_SupportExecuteDisable;
|
||||
@ -67,37 +60,6 @@ FASTCALL_ABI void paging_modeswitch_4LevelPaging(void *pml4, int pcid);
|
||||
FASTCALL_ABI void paging_modeswitch_4LevelPagingNX(void *pml4, int pcid); // with setting the Execute-Disalbe bit
|
||||
FASTCALL_ABI void paging_modeswitch_Table(void *pml, int pcid);
|
||||
|
||||
static inline const char *
|
||||
memoryTypeName(EFI_MEMORY_TYPE type) {
|
||||
#define CASE(c) \
|
||||
case c: \
|
||||
return #c;
|
||||
switch (type) {
|
||||
CASE(EfiReservedMemoryType)
|
||||
CASE(EfiLoaderCode)
|
||||
CASE(EfiLoaderData)
|
||||
CASE(EfiBootServicesCode)
|
||||
CASE(EfiBootServicesData)
|
||||
CASE(EfiRuntimeServicesCode)
|
||||
CASE(EfiRuntimeServicesData)
|
||||
CASE(EfiConventionalMemory)
|
||||
CASE(EfiUnusableMemory)
|
||||
CASE(EfiACPIReclaimMemory)
|
||||
CASE(EfiACPIMemoryNVS)
|
||||
CASE(EfiMemoryMappedIO)
|
||||
CASE(EfiMemoryMappedIOPortSpace)
|
||||
CASE(EfiPalCode)
|
||||
case EfiMaxMemoryType:
|
||||
return "EfiPersistentMemory";
|
||||
}
|
||||
return "(unknown)";
|
||||
#undef CASE
|
||||
}
|
||||
|
||||
#ifndef NEXT_MEMORY_DESCRITOR
|
||||
#define NEXT_MEMORY_DESCRITOR(desc, size) ((EFI_MEMORY_DESCRIPTOR *)((char *)desc + size)))
|
||||
#endif
|
||||
|
||||
|
||||
inline static uint64_t roundUpTo2Exponent(uint64_t v) {
|
||||
uint64_t s = 1;
|
||||
|
42
memory/paging_internal_efi.h
Normal file
42
memory/paging_internal_efi.h
Normal file
@ -0,0 +1,42 @@
|
||||
#pragma once
|
||||
|
||||
#include "../efimain.h"
|
||||
|
||||
|
||||
// defined in paging_init.c
|
||||
extern EFI_MEMORY_DESCRIPTOR *efiMemoryMap;
|
||||
extern UINTN efiMemoryMapSize;
|
||||
extern UINTN efiMemoryMapKey;
|
||||
extern UINTN efiDescriptorSize;
|
||||
extern UINT32 efiDescriptorVertion;
|
||||
|
||||
static inline const char *
|
||||
memoryTypeName(EFI_MEMORY_TYPE type) {
|
||||
#define CASE(c) \
|
||||
case c: \
|
||||
return #c;
|
||||
switch (type) {
|
||||
CASE(EfiReservedMemoryType)
|
||||
CASE(EfiLoaderCode)
|
||||
CASE(EfiLoaderData)
|
||||
CASE(EfiBootServicesCode)
|
||||
CASE(EfiBootServicesData)
|
||||
CASE(EfiRuntimeServicesCode)
|
||||
CASE(EfiRuntimeServicesData)
|
||||
CASE(EfiConventionalMemory)
|
||||
CASE(EfiUnusableMemory)
|
||||
CASE(EfiACPIReclaimMemory)
|
||||
CASE(EfiACPIMemoryNVS)
|
||||
CASE(EfiMemoryMappedIO)
|
||||
CASE(EfiMemoryMappedIOPortSpace)
|
||||
CASE(EfiPalCode)
|
||||
case EfiMaxMemoryType:
|
||||
return "EfiPersistentMemory";
|
||||
}
|
||||
return "(unknown)";
|
||||
#undef CASE
|
||||
}
|
||||
|
||||
#ifndef NEXT_MEMORY_DESCRITOR
|
||||
#define NEXT_MEMORY_DESCRITOR(desc, size) ((EFI_MEMORY_DESCRIPTOR *)((char *)desc + size)))
|
||||
#endif
|
@ -6,6 +6,7 @@
|
||||
#include "../graphics/graphics.h"
|
||||
#include "../driver/irq/pic/serial/serial.h"
|
||||
|
||||
#include "../efimain.h"
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
@ -100,16 +101,3 @@ int io_Printf(const char *fmt, ...) {
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
EFI_INPUT_KEY io_PauseForKeystroke() {
|
||||
#ifdef HELOS_RUNTIME_QUIET
|
||||
EFI_INPUT_KEY k = {0, 0};
|
||||
return k;
|
||||
#else
|
||||
UINTN index;
|
||||
EFI_INPUT_KEY key;
|
||||
efiBootServices->WaitForEvent(1, &efiStdin->WaitForKey, &index);
|
||||
efiSystemTable->ConIn->ReadKeyStroke(efiSystemTable->ConIn, &key);
|
||||
return key;
|
||||
#endif
|
||||
}
|
||||
|
@ -20,8 +20,6 @@ void io_WriteConsoleASCII(const char *str);
|
||||
// io_Printf is a printf() replacement, printing to WriteConsole function.
|
||||
int io_Printf(const char *format, ...);
|
||||
|
||||
EFI_INPUT_KEY io_PauseForKeystroke();
|
||||
|
||||
|
||||
// Debugging printing marcos
|
||||
#ifndef NDEBUG
|
||||
|
Loading…
Reference in New Issue
Block a user