7static EFI_SYSTEM_TABLE*
st;
11 asm volatile(
"outb %0, %1"::
"a"(data),
"d"(port));
16 asm volatile(
"inb %1, %0":
"=a"(data):
"d"(port));
21 return inb(0x3F8 + 5) & 0x20;
25 for(
size_t i = 0; i < len; ++i) {
37 st->ConOut->OutputString(
st->ConOut, s);
40 char* msg =
malloc(len + 1);
43 if(len > 1 && len != (
size_t)-1) {
52void*
memset(
void* s,
int c,
size_t n) {
53 for(
size_t i = 0; i < n; ++i) {
60void*
memcpy(
void* dest,
const void* src,
size_t n) {
61 for(
size_t i = 0; i < n; ++i) {
62 *((
char*)dest + i) = *((
char*)src + i);
68int memcmp(
const void* a,
const void* b,
size_t n) {
69 for(
size_t i = 0; i < n; ++i) {
70 int diff = ((
const char*)a)[i] - ((
const char*)b)[i];
86size_t strcpy(
char* d,
const char* s) {
110int wcscmp(
const CHAR16* s1,
const CHAR16* s2) {
112 while(*(s1 + i) && *(s1 + i) == *(s2 + i)) {
116 return *(s2 + i) - *(s1 + i);
120 if(c >=
'a' && c <=
'z') {
121 return c - (
'a' -
'A');
129 while(s1[i] && s2[i]) {
143 return *(s2 + i) - *(s1 + i);
147size_t wcstombs(
char* dest,
const CHAR16* src,
size_t n) {
150 for(i = 0; i < len && i < n; ++i) {
171 if(
BS->AllocatePool(EfiLoaderData,
size +
sizeof(
size_t), &mem) == EFI_SUCCESS) {
172 *(
size_t*)mem =
size;
173 return mem +
sizeof(
size_t);
181 BS->FreePool(ptr -
sizeof(
size_t));
189 size_t orig = *(
size_t*)(ptr -
sizeof(
size_t));
197 const CHAR16* chars = L
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
199 const size_t buffer_size = 65;
200 CHAR16 buffer[buffer_size];
201 buffer[buffer_size - 1] = 0;
206 buffer[buffer_size - 1 -++len] = chars[i %
base];
210 conwrite(buffer + (buffer_size - len) - 1);
227 __builtin_va_list args;
228 __builtin_va_start(args, fmt);
232 int long_counter = 0;
235 while((c = *(fmt + i))) {
261 CHAR16* b = __builtin_va_arg(args,
int) ? L
"true" : L
"false";
266 CHAR16* s = __builtin_va_arg(args, CHAR16*);
271 unsigned long long int u;
273 if(long_counter == 2) {
274 u = __builtin_va_arg(args,
unsigned long long int);
277 u = __builtin_va_arg(args,
unsigned int);
285 if(long_counter == 2) {
286 d = __builtin_va_arg(args,
long long int);
289 d = __builtin_va_arg(args,
int);
297 if(long_counter == 2) {
298 x = __builtin_va_arg(args,
long long int);
301 x = __builtin_va_arg(args,
int);
315 __builtin_va_end(args);
321 outb(0x3F8 + 1, 0x00);
322 outb(0x3F8 + 3, 0x80);
323 outb(0x3F8 + 0, 0x0c);
324 outb(0x3F8 + 1, 0x00);
325 outb(0x3F8 + 3, 0x03);
327 outb(0x3F8 + 2, 0xC7);
332 outb(0x3F8 + 4, mcr | 0x10);
333 outb(0x3F8 + 0,
'\n');
334 if(
inb(0x3F8) ==
'\n') {
335 outb(0x3F8 + 4, mcr);
343 if(
wcscmp(
st->FirmwareVendor, L
"Debian distribution of EDK II") != 0) {
347 wprintf(L
"UART configured and output%senabled\n",
uart_out ? L
" " : L
" NOT ");
348 wprintf(L
"Firmware vendor: %s\n",
st->FirmwareVendor);
352void init_stdlib(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE* system_table) {
354 BS =
st->BootServices;
355 st->ConOut->ClearScreen(
st->ConOut);
size_t strlen(const char *str)
void * memcpy(void *dest, void const *source, size_t size)
void * memset(void *dest, int c, size_t size)
int memcmp(const void *a, const void *b, size_t n)
size_t wcslen(const wchar_t *str)
static uint8_t inb(uint16_t port)
static void conwrite(CHAR16 *s)
static EFI_SYSTEM_TABLE * st
size_t wprinti(long long int i, unsigned char base)
CHAR16 towlower(CHAR16 c)
size_t wprintui(unsigned long long int i, unsigned char base)
static void outb(uint16_t port, uint8_t data)
void * malloc(size_t size)
size_t strcpy(char *d, const char *s)
int wprintf(const CHAR16 *fmt,...)
void init_stdlib(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table)
int wcscpy(CHAR16 *d, const CHAR16 *s)
void * realloc(void *ptr, size_t size)
size_t wcstombs(char *dest, const CHAR16 *src, size_t n)
int wcscmp(const CHAR16 *s1, const CHAR16 *s2)
static int is_transmit_empty()
static void uart_write(char *msg, size_t len)
int wcscasecmp(const CHAR16 *s1, const CHAR16 *s2)
uint16_t size
Size of the loaded file.