Handout
This commit is contained in:
		
							
								
								
									
										13
									
								
								compiler/fix.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								compiler/fix.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
/*! \file
 | 
			
		||||
 *  \brief Compiler-dependent fixes & idiosyncrasies
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "../types.h"
 | 
			
		||||
 | 
			
		||||
#if defined(__GNUC__) && !defined(__clang__)
 | 
			
		||||
// Only GCC understands the error attribute
 | 
			
		||||
#define ERROR_ON_CALL(MSG) __attribute__((error(MSG)));
 | 
			
		||||
#else
 | 
			
		||||
#define ERROR_ON_CALL(MSG)
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										45
									
								
								compiler/libc.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								compiler/libc.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
#include "libc.h"
 | 
			
		||||
 | 
			
		||||
/*! \brief Function pointer for initialization/finalization functions for global
 | 
			
		||||
 * objects required since GCC 4.7 and later.
 | 
			
		||||
 *
 | 
			
		||||
 * These symbols appear kind of magically due to the compiler
 | 
			
		||||
 */
 | 
			
		||||
extern void (*__preinit_array_start[])();
 | 
			
		||||
extern void (*__preinit_array_end[])();
 | 
			
		||||
extern void (*__init_array_start[])();
 | 
			
		||||
extern void (*__init_array_end[])();
 | 
			
		||||
extern void (*__fini_array_start[])();
 | 
			
		||||
extern void (*__fini_array_end[])();
 | 
			
		||||
 | 
			
		||||
namespace CSU {
 | 
			
		||||
 | 
			
		||||
void initializer() {
 | 
			
		||||
  const unsigned int preinit_size = __preinit_array_end - __preinit_array_start;
 | 
			
		||||
  for (unsigned int i = 0; i != preinit_size; ++i) {
 | 
			
		||||
    (*__preinit_array_start[i])();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const size_t size = __init_array_end - __init_array_start;
 | 
			
		||||
  for (size_t i = 0; i < size; i++) {
 | 
			
		||||
    (*__init_array_start[i])();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void finalizer() {
 | 
			
		||||
  const unsigned int fini_size = __fini_array_end - __fini_array_start;
 | 
			
		||||
  for (unsigned int i = 0; i != fini_size; ++i) {
 | 
			
		||||
    (*__fini_array_start[i])();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace CSU
 | 
			
		||||
 | 
			
		||||
extern "C" int atexit(void (*func)(void)) {
 | 
			
		||||
  // Registers a function that will be executed on exit.
 | 
			
		||||
  // We simply ignore those functions, as we don't need them for our operating
 | 
			
		||||
  // systems.
 | 
			
		||||
  (void)func;
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								compiler/libc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								compiler/libc.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
/*! \file
 | 
			
		||||
 *  \brief Initialization functions for global objects required by the compiler
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "../types.h"
 | 
			
		||||
 | 
			
		||||
/*! \brief C StartUp (CSU)
 | 
			
		||||
 * required by the compiler and provided by the c standard library
 | 
			
		||||
 */
 | 
			
		||||
namespace CSU {
 | 
			
		||||
 | 
			
		||||
/*! \brief Call global constructors and initialization functions
 | 
			
		||||
 * (this is usually done by __libc_csu_init)
 | 
			
		||||
 */
 | 
			
		||||
void initializer();
 | 
			
		||||
 | 
			
		||||
/*! \brief Call global destructors and finalizer functions
 | 
			
		||||
 * (this is usually done by __libc_csu_fini)
 | 
			
		||||
 */
 | 
			
		||||
void finalizer();
 | 
			
		||||
 | 
			
		||||
}  // namespace CSU
 | 
			
		||||
							
								
								
									
										21
									
								
								compiler/libcxx.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								compiler/libcxx.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
/*! \file
 | 
			
		||||
 *  \brief C++ runtime support functions
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "../types.h"
 | 
			
		||||
 | 
			
		||||
void* operator new(size_t, void* place) { return place; }
 | 
			
		||||
 | 
			
		||||
void operator delete(void* ptr) { (void)ptr; }
 | 
			
		||||
 | 
			
		||||
void operator delete(void* ptr, size_t size) {
 | 
			
		||||
  (void)ptr;
 | 
			
		||||
  (void)size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
extern "C" [[noreturn]] void __cxa_pure_virtual() {
 | 
			
		||||
  // Pure virtual function was called -- this if obviously not valid,
 | 
			
		||||
  // therefore we wait infinitely.
 | 
			
		||||
  while (true) {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										107
									
								
								compiler/sections.ld
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								compiler/sections.ld
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,107 @@
 | 
			
		||||
/* Entry in our OS -- label 'startup_bsp' in file boot/startup.asm */
 | 
			
		||||
ENTRY(startup_bsp)
 | 
			
		||||
 | 
			
		||||
SECTIONS
 | 
			
		||||
 {
 | 
			
		||||
	/* start address of our kernel */
 | 
			
		||||
	. = 16M;
 | 
			
		||||
 | 
			
		||||
	___KERNEL_START___ = .;
 | 
			
		||||
 | 
			
		||||
	.boot :
 | 
			
		||||
	{
 | 
			
		||||
		/* Multiboot Header should be at the very beginning */
 | 
			
		||||
		*(.multiboot_header)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	___KERNEL_TEXT_START___ = .;
 | 
			
		||||
 | 
			
		||||
	.text :
 | 
			
		||||
	{
 | 
			
		||||
		*(".text")
 | 
			
		||||
		*(".text$")
 | 
			
		||||
		*(".init")
 | 
			
		||||
		*(".fini")
 | 
			
		||||
		*(".gnu.linkonce.*")
 | 
			
		||||
		KEEP(*(.note.gnu.build-id))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* lists containing the start address of global constructors and destructors (generated by the compiler) */
 | 
			
		||||
	.preinit_array :
 | 
			
		||||
	{
 | 
			
		||||
		PROVIDE_HIDDEN (__preinit_array_start = .);
 | 
			
		||||
		KEEP (*(.preinit_array))
 | 
			
		||||
		PROVIDE_HIDDEN (__preinit_array_end = .);
 | 
			
		||||
	}
 | 
			
		||||
	.init_array :
 | 
			
		||||
	{
 | 
			
		||||
		PROVIDE_HIDDEN (__init_array_start = .);
 | 
			
		||||
		KEEP (*(SORT(.init_array.*)))
 | 
			
		||||
		KEEP (*(.init_array))
 | 
			
		||||
		PROVIDE_HIDDEN (__init_array_end = .);
 | 
			
		||||
	}
 | 
			
		||||
	.fini_array :
 | 
			
		||||
	{
 | 
			
		||||
		PROVIDE_HIDDEN (__fini_array_start = .);
 | 
			
		||||
		KEEP (*(SORT(.fini_array.*)))
 | 
			
		||||
		KEEP (*(.fini_array))
 | 
			
		||||
		PROVIDE_HIDDEN (__fini_array_end = .);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	___KERNEL_TEXT_END___ = .;
 | 
			
		||||
 | 
			
		||||
	.data :
 | 
			
		||||
	{
 | 
			
		||||
		*(".data")
 | 
			
		||||
		*(".data$")
 | 
			
		||||
		*(".rodata")
 | 
			
		||||
		___CTOR_LIST__ = .;
 | 
			
		||||
		*(".ctors")
 | 
			
		||||
		*(".ctor")
 | 
			
		||||
		___CTOR_LIST_END__ = .;
 | 
			
		||||
		___DTOR_LIST__ = .;
 | 
			
		||||
		*(".dtors")
 | 
			
		||||
		*(".dtor")
 | 
			
		||||
		___DTOR_LIST_END__ = .;
 | 
			
		||||
		*(".got")
 | 
			
		||||
		*(".got.plt")
 | 
			
		||||
		*(".eh_frame")
 | 
			
		||||
		*(".eh_fram")
 | 
			
		||||
		*(".jcr")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Start for application processors, relocated by APIC::init()
 | 
			
		||||
	 * to a below 1 MB address to boot from real mode.
 | 
			
		||||
	 * It is possible to let the linker place it at a below 1 MB address,
 | 
			
		||||
	 * while all the rest starts at 16 MB. This will work for multiboot
 | 
			
		||||
	 * compliant boot loader like GRUB and PXELINUX, however,
 | 
			
		||||
	 * the qemu boot loader cannot handle such ELF files (yet)...
 | 
			
		||||
	 * That's why we have to do it in our software */
 | 
			
		||||
	.setup_ap_seg ALIGN(0x10) :
 | 
			
		||||
	{
 | 
			
		||||
		___SETUP_AP_START__ = .;
 | 
			
		||||
		*(".setup_ap_seg")
 | 
			
		||||
		*(".setup_ap_seg$")
 | 
			
		||||
	}
 | 
			
		||||
	___SETUP_AP_END__ = .;
 | 
			
		||||
 | 
			
		||||
	.bss :
 | 
			
		||||
	{
 | 
			
		||||
		*(".bss")
 | 
			
		||||
		*(".bss.*")
 | 
			
		||||
		*(COMMON)
 | 
			
		||||
	}
 | 
			
		||||
	___KERNEL_END___ = .;
 | 
			
		||||
 | 
			
		||||
	/DISCARD/ :
 | 
			
		||||
	{
 | 
			
		||||
		*(".note")
 | 
			
		||||
		*(".comment")
 | 
			
		||||
/* Keep debug information
 | 
			
		||||
		*(".debug_line")
 | 
			
		||||
		*(".debug_info")
 | 
			
		||||
		*(".debug_abbrev")
 | 
			
		||||
		*(".debug_aranges")
 | 
			
		||||
*/
 | 
			
		||||
	}
 | 
			
		||||
 }
 | 
			
		||||
		Reference in New Issue
	
	Block a user