mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 12:02:43 +00:00 
			
		
		
		
	 7e94b090fe
			
		
	
	
		7e94b090fe
		
	
	
	
	
		
			
			This implements a simple bootloader that is capable of loading ELF64 kernel images. It does this by using QEMU/GRUB to load the kernel image from disk and pass it to our bootloader as a Multiboot module. The bootloader then parses the ELF image and sets it up appropriately. The kernel's entry point is a C++ function with architecture-native code. Co-authored-by: Liav A <liavalb@gmail.com>
		
			
				
	
	
		
			117 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #ifdef __i386__
 | |
| #    define AK_ARCH_I386 1
 | |
| #endif
 | |
| 
 | |
| #ifdef __x86_64__
 | |
| #    define AK_ARCH_X86_64 1
 | |
| #endif
 | |
| 
 | |
| #if defined(__APPLE__) && defined(__MACH__)
 | |
| #    define AK_OS_MACOS
 | |
| #    define AK_OS_BSD_GENERIC
 | |
| #endif
 | |
| 
 | |
| #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
 | |
| #    define AK_OS_BSD_GENERIC
 | |
| #endif
 | |
| 
 | |
| #define ARCH(arch) (defined(AK_ARCH_##arch) && AK_ARCH_##arch)
 | |
| 
 | |
| #if !defined(__clang__)
 | |
| #    define AK_HAS_CONDITIONALLY_TRIVIAL
 | |
| #endif
 | |
| 
 | |
| #ifdef ALWAYS_INLINE
 | |
| #    undef ALWAYS_INLINE
 | |
| #endif
 | |
| #define ALWAYS_INLINE __attribute__((always_inline)) inline
 | |
| 
 | |
| #ifdef NEVER_INLINE
 | |
| #    undef NEVER_INLINE
 | |
| #endif
 | |
| #define NEVER_INLINE __attribute__((noinline))
 | |
| 
 | |
| #ifdef FLATTEN
 | |
| #    undef FLATTEN
 | |
| #endif
 | |
| #define FLATTEN __attribute__((flatten))
 | |
| 
 | |
| #ifdef RETURNS_NONNULL
 | |
| #    undef RETURNS_NONNULL
 | |
| #endif
 | |
| #define RETURNS_NONNULL __attribute__((returns_nonnull))
 | |
| 
 | |
| #ifdef NO_SANITIZE_ADDRESS
 | |
| #    undef NO_SANITIZE_ADDRESS
 | |
| #endif
 | |
| #define NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
 | |
| 
 | |
| #ifdef NAKED
 | |
| #    undef NAKED
 | |
| #endif
 | |
| #define NAKED __attribute__((naked))
 | |
| 
 | |
| #ifdef DISALLOW
 | |
| #    undef DISALLOW
 | |
| #endif
 | |
| #ifdef __clang__
 | |
| #    define DISALLOW(message) __attribute__((diagnose_if(1, message, "error")))
 | |
| #else
 | |
| #    define DISALLOW(message) __attribute__((error(message)))
 | |
| #endif
 | |
| 
 | |
| // GCC doesn't have __has_feature but clang does
 | |
| #ifndef __has_feature
 | |
| #    define __has_feature(...) 0
 | |
| #endif
 | |
| 
 | |
| #if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
 | |
| #    define HAS_ADDRESS_SANITIZER
 | |
| #    define ASAN_POISON_MEMORY_REGION(addr, size) __asan_poison_memory_region(addr, size)
 | |
| #    define ASAN_UNPOISON_MEMORY_REGION(addr, size) __asan_unpoison_memory_region(addr, size)
 | |
| #else
 | |
| #    define ASAN_POISON_MEMORY_REGION(addr, size)
 | |
| #    define ASAN_UNPOISON_MEMORY_REGION(addr, size)
 | |
| #endif
 | |
| 
 | |
| #ifndef __serenity__
 | |
| #    include <unistd.h>
 | |
| #    undef PAGE_SIZE
 | |
| #    define PAGE_SIZE sysconf(_SC_PAGESIZE)
 | |
| #endif
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| ALWAYS_INLINE int count_trailing_zeroes_32(unsigned int val)
 | |
| {
 | |
| #    if defined(__GNUC__) || defined(__clang__)
 | |
|     return __builtin_ctz(val);
 | |
| #    else
 | |
|     for (u8 i = 0; i < 32; ++i) {
 | |
|         if ((val >> i) & 1) {
 | |
|             return i;
 | |
|         }
 | |
|     }
 | |
|     return 0;
 | |
| #    endif
 | |
| }
 | |
| 
 | |
| ALWAYS_INLINE int count_trailing_zeroes_32_safe(unsigned int val)
 | |
| {
 | |
|     if (val == 0)
 | |
|         return 32;
 | |
|     return count_trailing_zeroes_32(val);
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #ifdef AK_OS_BSD_GENERIC
 | |
| #    define CLOCK_MONOTONIC_COARSE CLOCK_MONOTONIC
 | |
| #    define CLOCK_REALTIME_COARSE CLOCK_REALTIME
 | |
| #endif
 |