diff --git a/boards/x86-multiboot-common/Makefile b/boards/x86-multiboot-common/Makefile deleted file mode 100644 index d6b64fe1d5cce161f78580e1f554a4a32ac02eca..0000000000000000000000000000000000000000 --- a/boards/x86-multiboot-common/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -MODULE = x86-multiboot-common - -include $(RIOTBASE)/Makefile.base diff --git a/boards/x86-multiboot-common/Makefile.include b/boards/x86-multiboot-common/Makefile.include deleted file mode 100644 index 1eb877a67b5f7350713c6c8cb46a3f33075b542d..0000000000000000000000000000000000000000 --- a/boards/x86-multiboot-common/Makefile.include +++ /dev/null @@ -1,67 +0,0 @@ -ifeq (, $(NEWLIB_BASE)) - NEWLIB_BASE := $(RIOTBASE)/toolchain/x86/i586-none-elf -endif - -ifneq (0, $(shell test -e "$(NEWLIB_BASE)/lib/libc.a" && echo $$?)) - NEWLIB_PRECOMPILED_NAME := i586-newlib_2.2.0.20150623_tlsf-3337.tar.bz2 - NEWLIB_PRECOMPILED := http://download.riot-os.org/$(NEWLIB_PRECOMPILED_NAME) - NEWLIB_PRECOMPILED_MD5 := 8090a768cf0294b259fe7ad904d085c7 - - $(warning Precompiled newlib is missing in $(NEWLIB_BASE)) - $(warning Downloading from $(NEWLIB_PRECOMPILED)) - - $(shell cd $(RIOTBASE) && $(DLCACHE) "$(NEWLIB_PRECOMPILED)" 8090a768cf0294b259fe7ad904d085c7 - | tar xj) -endif - -ifeq (,$(BUILD_INCLUDE_BASE)) - GCC_BUILD_TRIPLET ?= $(shell gcc -dumpmachine) - GCC_BUILD_VERSION ?= $(shell gcc -dumpversion) - BUILD_INCLUDE_BASE = /usr/lib/gcc/$(GCC_BUILD_TRIPLET)/$(GCC_BUILD_VERSION) - - ifeq (,$(shell echo $(GCC_BUILD_TRIPLET) | sed -e 's,-.*,,' | grep -e '\(x\|i[3-7]\)86')) - $(warning Your build machine is a(n) $(GCC_BUILD_TRIPLET).) - $(warning Since this is not IA32 compatible, you must set BUILD_INCLUDE_BASE explicitly!) - endif -endif - -export INCLUDES += -isystem $(BUILD_INCLUDE_BASE)/include \ - -isystem $(NEWLIB_BASE)/include \ - -isystem $(NEWLIB_BASE)/sys-include \ - -isystem $(BUILD_INCLUDE_BASE)/include-fixed \ - -I$(RIOTBOARD)/x86-multiboot-common/include -export CPU = x86 - -# toolchain config -export CC ?= $(PREFIX)gcc -ifeq ($(LTO),1) - export AR = $(PREFIX)gcc-ar -else - export AR = $(PREFIX)ar -endif -export AS ?= $(PREFIX)as -export RANLIB ?= $(PREFIX)ranlib -export LINK ?= $(RIOTBASE)/boards/x86-multiboot-common/dist/link $(PREFIX)gcc -export SIZE ?= $(PREFIX)size -export OBJCOPY ?= $(PREFIX)objcopy - -export CFLAGS += -m32 -mfpmath=387 -ffreestanding -nostdlib -nostdinc -fno-builtin -export OFLAGS = -O binary - -LINKFLAGS += -m32 -nostdlib -nostdinc -nostartfiles -nodefaultlibs \ - --prefix=$(NEWLIB_BASE) \ - -Wl,-rpath,$(NEWLIB_BASE)/lib \ - -T$(RIOTBASE)/boards/x86-multiboot-common/linker.ld - -# clean up unused functions -export CFLAGS += -ffunction-sections -fdata-sections -export LINKFLAGS += -Wl,--gc-sections - -UNDEF += $(BINDIR)/x86-multiboot-common/startup.o - -BASELIBS += $(NEWLIB_BASE)/lib/libc.a \ - $(NEWLIB_BASE)/lib/libm.a - -all: - -all-debug: export CFLAGS += -ggdb3 -O0 -all-debug: all diff --git a/boards/x86-multiboot-common/dist/link b/boards/x86-multiboot-common/dist/link deleted file mode 100755 index 048a8c30508f485441201990663187f1f26158b0..0000000000000000000000000000000000000000 --- a/boards/x86-multiboot-common/dist/link +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -args=($@) - -for ((i = 0; i < ${#args[@]}; ++i)) -do - if [[ "${args[i]}" == '-lm' ]] - then - unset args[i] - break - fi -done - -exec "${args[@]}" diff --git a/boards/x86-multiboot-common/include/multiboot.h b/boards/x86-multiboot-common/include/multiboot.h deleted file mode 100644 index 09d57042b29b6b0fb03ed64d9a0b566dde5b75f4..0000000000000000000000000000000000000000 --- a/boards/x86-multiboot-common/include/multiboot.h +++ /dev/null @@ -1,238 +0,0 @@ -/* Copyright (C) 1999,2003,2007,2008,2009 Free Software Foundation, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ANY - * DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR - * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/** - * @defgroup boards_x86-multiboot i586 multiboot common - * @ingroup boards - * @brief Common files for multiboot enabled kernels - * - * @ingroup x86-multiboot - * @{ - * @file - * @brief Architecture specific definitions for multiboot enabled kernels - */ - -#ifndef MULTIBOOT_H -#define MULTIBOOT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** How many bytes from the start of the file we search for the header. */ -#define MULTIBOOT_SEARCH 8192 - -/** The flags for the Multiboot header. */ -#define MULTIBOOT_HEADER_FLAGS 0x00010003 - -/** The magic field should contain this. */ -#define MULTIBOOT_HEADER_MAGIC 0x1BADB002 - -/** This should be in %eax. */ -#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002 - -/** The bits in the required part of flags field we don't support. */ -#define MULTIBOOT_UNSUPPORTED 0x0000fffc - -/** Alignment of multiboot modules. */ -#define MULTIBOOT_MOD_ALIGN 0x00001000 - -/** Alignment of the multiboot info structure. */ -#define MULTIBOOT_INFO_ALIGN 0x00000004 - -/** Flags set in the 'flags' member of the multiboot header. */ - -/** Align all boot modules on i386 page (4KB) boundaries. */ -#define MULTIBOOT_PAGE_ALIGN 0x00000001 - -/** Must pass memory information to OS. */ -#define MULTIBOOT_MEMORY_INFO 0x00000002 - -/** Must pass video information to OS. */ -#define MULTIBOOT_VIDEO_MODE 0x00000004 - -/** This flag indicates the use of the address fields in the header. */ -#define MULTIBOOT_AOUT_KLUDGE 0x00010000 - -/** Flags to be set in the 'flags' member of the multiboot info structure. */ - -/** is there basic lower/upper memory information? */ -#define MULTIBOOT_INFO_MEMORY 0x00000001 -/** is there a boot device set? */ -#define MULTIBOOT_INFO_BOOTDEV 0x00000002 -/** is the command-line defined? */ -#define MULTIBOOT_INFO_CMDLINE 0x00000004 -/** are there modules to do something with? */ -#define MULTIBOOT_INFO_MODS 0x00000008 - -/** These next two are mutually exclusive */ - -/** is there a symbol table loaded? */ -#define MULTIBOOT_INFO_AOUT_SYMS 0x00000010 -/** is there an ELF section header table? */ -#define MULTIBOOT_INFO_ELF_SHDR 0X00000020 - -/** is there a full memory map? */ -#define MULTIBOOT_INFO_MEM_MAP 0x00000040 - -/** Is there drive info? */ -#define MULTIBOOT_INFO_DRIVE_INFO 0x00000080 - -/** Is there a config table? */ -#define MULTIBOOT_INFO_CONFIG_TABLE 0x00000100 - -/** Is there a boot loader name? */ -#define MULTIBOOT_INFO_BOOT_LOADER_NAME 0x00000200 - -/** Is there a APM table? */ -#define MULTIBOOT_INFO_APM_TABLE 0x00000400 - -/** Is there video information? */ -#define MULTIBOOT_INFO_VIDEO_INFO 0x00000800 - -#ifndef ASM_FILE - -typedef unsigned short multiboot_uint16_t; -typedef unsigned int multiboot_uint32_t; -typedef unsigned long long multiboot_uint64_t; - -typedef struct multiboot_header { - /** Must be MULTIBOOT_MAGIC - see above. */ - multiboot_uint32_t magic; - - /** Feature flags. */ - multiboot_uint32_t flags; - - /** The above fields plus this one must equal 0 mod 2^32. */ - multiboot_uint32_t checksum; - - /** These are only valid if MULTIBOOT_AOUT_KLUDGE is set. */ - multiboot_uint32_t header_addr; - multiboot_uint32_t load_addr; - multiboot_uint32_t load_end_addr; - multiboot_uint32_t bss_end_addr; - multiboot_uint32_t entry_addr; - - /** These are only valid if MULTIBOOT_VIDEO_MODE is set. */ - multiboot_uint32_t mode_type; - multiboot_uint32_t width; - multiboot_uint32_t height; - multiboot_uint32_t depth; -} multiboot_header_t; - -/** The symbol table for a.out. */ -struct multiboot_aout_symbol_table { - multiboot_uint32_t tabsize; - multiboot_uint32_t strsize; - multiboot_uint32_t addr; - multiboot_uint32_t reserved; -}; -typedef struct multiboot_aout_symbol_table multiboot_aout_symbol_table_t; - -/** The section header table for ELF. */ -struct multiboot_elf_section_header_table { - multiboot_uint32_t num; - multiboot_uint32_t size; - multiboot_uint32_t addr; - multiboot_uint32_t shndx; -}; -typedef struct multiboot_elf_section_header_table multiboot_elf_section_header_table_t; - -struct multiboot_info { - /** Multiboot info version number */ - multiboot_uint32_t flags; - - /** Available memory from BIOS */ - multiboot_uint32_t mem_lower; - multiboot_uint32_t mem_upper; - - /** "root" partition */ - multiboot_uint32_t boot_device; - - /** Kernel command line */ - multiboot_uint32_t cmdline; - - /** Boot-Module list */ - multiboot_uint32_t mods_count; - multiboot_uint32_t mods_addr; - - union { - multiboot_aout_symbol_table_t aout_sym; - multiboot_elf_section_header_table_t elf_sec; - } u; - - /** Memory Mapping buffer */ - multiboot_uint32_t mmap_length; - multiboot_uint32_t mmap_addr; - - /** Drive Info buffer */ - multiboot_uint32_t drives_length; - multiboot_uint32_t drives_addr; - - /** ROM configuration table */ - multiboot_uint32_t config_table; - - /** Boot Loader Name */ - multiboot_uint32_t boot_loader_name; - - /** APM table */ - multiboot_uint32_t apm_table; - - /** Video */ - multiboot_uint32_t vbe_control_info; - multiboot_uint32_t vbe_mode_info; - multiboot_uint16_t vbe_mode; - multiboot_uint16_t vbe_interface_seg; - multiboot_uint16_t vbe_interface_off; - multiboot_uint16_t vbe_interface_len; -}; -typedef struct multiboot_info multiboot_info_t; - -struct multiboot_mmap_entry { - multiboot_uint32_t size; - multiboot_uint64_t addr; - multiboot_uint64_t len; -#define MULTIBOOT_MEMORY_AVAILABLE 1 -#define MULTIBOOT_MEMORY_RESERVED 2 - multiboot_uint32_t type; -} __attribute__((packed)); -typedef struct multiboot_mmap_entry multiboot_memory_map_t; - -struct multiboot_mod_list { - /** the memory used goes from bytes 'mod_start' to 'mod_end-1' inclusive */ - multiboot_uint32_t mod_start; - multiboot_uint32_t mod_end; - - /** Module command line */ - multiboot_uint32_t cmdline; - - /** padding to take it to 16 bytes (must be zero) */ - multiboot_uint32_t pad; -}; -typedef struct multiboot_mod_list multiboot_module_t; - -#endif /** ! ASM_FILE */ - -#ifdef __cplusplus -} -#endif - -#endif /* MULTIBOOT_H */ -/** @} */ diff --git a/boards/x86-multiboot-common/linker.ld b/boards/x86-multiboot-common/linker.ld deleted file mode 100644 index e6e1fb08b9105b1045ac91e128f17976369d9408..0000000000000000000000000000000000000000 --- a/boards/x86-multiboot-common/linker.ld +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2014 René Kijewski <rene.kijewski@fu-berlin.de> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* The bootloader will look at this image and start execution at the symbol - designated as the entry point. */ -ENTRY(_start) - -/* Tell where the various sections of the object files will be put in the final - kernel image. */ -SECTIONS -{ - /* Begin putting sections at 1 MiB, a conventional place for kernels to be - loaded at by the bootloader. */ - . = 1M; - _kernel_memory_start = .; - - /* First put the multiboot header, as it is required to be put very early - early in the image or the bootloader won't recognize the file format. - Next we'll put the .text section. */ - ._multiboot_header : - { - KEEP(*(._multiboot_header)) - } - - .note.gnu.build-id : - { - *(.note.gnu.build-id) - } - - .text : - { - . = ALIGN(4); - _section_text_start = .; - - *(.text) - *(.text.*) - - *(.gnu.linkonce.t) - *(.gnu.linkonce.t.*) - - _section_text_end = .; - } - . = ALIGN(0x1000); - - /* Read-only data. */ - .rodata : - { - _section_rodata_start = .; - - *(.rodata) - *(.rodata.*) - - *(.gnu.linkonce.r) - *(.gnu.linkonce.r.*) - - _section_rodata_end = .; - } - . = ALIGN(0x1000); - - /* Read-write data (initialized) */ - .data : - { - _section_data_start = .; - - *(.data) - *(.data.*) - - *(.gnu.linkonce.d) - *(.gnu.linkonce.d.*) - - . = ALIGN(4); - _section_data_end = .; - /* no need to align between .data and .bss */ - } - - /* Read-write data (uninitialized) and stack */ - .bss : - { - _section_bss_start = .; - - *(COMMON) - *(COMMON.*) - - *(.bss) - *(.bss.*) - - *(.gnu.linkonce.b) - *(.gnu.linkonce.b.*) - - _section_bss_end = .; - } - - . = ALIGN(0x1000); - _kernel_memory_end = .; - - . += 0x1000; - . = ALIGN(0x10000); - _heap_start = .; - - /* The compiler may produce other sections, by default it will put them in - a segment with the same name. Simply add stuff here as needed. */ -} diff --git a/boards/x86-multiboot-common/startup.c b/boards/x86-multiboot-common/startup.c deleted file mode 100644 index d3ad80160163723aea2a56192c5d5b49fb315604..0000000000000000000000000000000000000000 --- a/boards/x86-multiboot-common/startup.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2014 René Kijewski <rene.kijewski@fu-berlin.de> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * @ingroup boards_x86-multiboot - * @{ - * - * @file - * @brief Startup code to be loaded by multiboot enabled bootloaders. - * - * @author René Kijewski <rene.kijewski@fu-berlin.de> - * - * @} - */ - -#include <cpu.h> -#include <multiboot.h> -#include <x86_kernel_memory.h> -#include <x86_memory.h> -#include <x86_reboot.h> -#include <x86_videoram.h> - -#include <inttypes.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#ifndef BREAK_STARTUP -# define BREAK_STARTUP (0) -#endif - -static void __attribute__((noreturn)) startup(uint32_t multiboot_magic, const multiboot_info_t *multiboot_info); -void __attribute__((noreturn, optimize("Os", "omit-frame-pointer"), no_instrument_function)) _start(void); - -extern const multiboot_header_t multiboot_header __attribute__((section("._multiboot_header"))); -const multiboot_header_t multiboot_header = { - .magic = MULTIBOOT_HEADER_MAGIC, - .flags = MULTIBOOT_HEADER_FLAGS, - .checksum = (-(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)), - .header_addr = (uintptr_t) &multiboot_header, - .load_addr = (uintptr_t) &_kernel_memory_start, - .load_end_addr = (uintptr_t) &_section_data_end, - .bss_end_addr = (uintptr_t) &_section_bss_end, - .entry_addr = (uintptr_t) &_start, -}; - -void __attribute__((noreturn, optimize("Os", "omit-frame-pointer"), no_instrument_function)) _start(void) -{ - __asm__ volatile ("xor %ebp, %ebp"); - __asm__ volatile ("push %ebp"); - __asm__ volatile ("push %ebx"); - __asm__ volatile ("push %eax"); - __asm__ volatile ("push %ebp"); - __asm__ volatile ("jmp *%0" :: "r"(&startup)); - __builtin_unreachable(); -} - -static const multiboot_info_t *multiboot_info; - -bool x86_get_memory_region(uint64_t *start, uint64_t *len, unsigned long *pos) -{ - while (1) { - if (*pos >= multiboot_info->mmap_length) { - return false; - } - - const multiboot_memory_map_t *mmap = (void *)(multiboot_info->mmap_addr + *pos); - *pos += mmap->size + 4; - - *start = mmap->addr; - *len = mmap->len; - - uint64_t end = *start + *len; - printf(" %08lx%08lx - %08lx%08lx ", (long) (*start >> 32), (long) *start, (long) (end >> 32), (long) end); - - if (mmap->type != 1) { - // not free (ignore reclaimable RAM) - const char *msg; - switch (mmap->type) { - case 2: msg = "reseved"; break; - case 3: msg = "ACPI [reclaimable]"; break; - case 4: msg = "ACPI [NVS]"; break; - case 5: msg = "bad memory"; break; - default: msg = "unknown"; - } - printf("(unusable: %s)\r\n", msg); - } - else { - puts("(usable)"); - return true; - } - } -} - -static void have_a_break(void) -{ - volatile bool cnt = false; - while (!cnt) { - __asm__ volatile ("pause"); - } -} - -static void __attribute__((noreturn)) startup(uint32_t multiboot_magic, const multiboot_info_t *multiboot_info_) -{ - x86_init_gdt(); /* load GDT early */ - x86_load_empty_idt(); /* just a safeguard to cause a tripple fault, not really needed */ - -#if BREAK_STARTUP - have_a_break(); -#else - (void) have_a_break; -#endif - - memset(&_section_bss_start, 0, &_section_bss_end - &_section_bss_start + 1); - - videoram_puts(" Booting RIOT \r\n"); - if (multiboot_magic != MULTIBOOT_BOOTLOADER_MAGIC) { - videoram_puts(" Multiboot magic is wrong \r\n"); - x86_hlt(); - } - else if (!(multiboot_info->flags && MULTIBOOT_INFO_MEM_MAP)) { - videoram_puts(" Multiboot is lacking memory map information \r\n"); - x86_hlt(); - } - - multiboot_info = multiboot_info_; - x86_startup(); -}