source: mainline/boot/arch/arm64/_link.ld.in@ 0373af9

topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 0373af9 was 84176f3, checked in by Jakub Jermář <jakub@…>, 6 years ago

arm64: Add support for the architecture

This changeset adds basic support to run HelenOS on AArch64, targeting
the QEMU virt platform.

Boot:

  • Boot relies on the EDK II firmware, GRUB2 for EFI and the HelenOS bootloader (UEFI application). EDK II loads GRUB2 from a CD, GRUB2 loads the HelenOS bootloader (via UEFI) which loads OS components.
  • UEFI applications use the PE/COFF format and must be relocatable. The first problem is solved by manually having the PE/COFF headers and tables written in assembler. The relocatable requirement is addressed by compiling the code with -fpic and having the bootloader relocate itself at its startup.

Kernel:

  • Kernel code for AArch64 consists mostly of stubbing out various architecture-specific hooks: virtual memory management, interrupt and exception handling, context switching (including FPU lazy switching), support for virtual timer, atomic sequences and barriers, cache and TLB maintenance, thread and process initialization.
  • The patch adds a kernel driver for GICv2 (interrupt controller).
  • The PL011 kernel driver is extended to allow userspace to take ownership of the console.
  • The current code is not able to dynamically obtain information about available devices on the underlying machine. The port instead implements a machine-func interface similar to the one implemented by arm32. It defines a machine for the QEMU AArch64 virt platform. The configuration (device addresses and IRQ numbers) is then baked into the machine definition.

User space:

  • Uspace code for AArch64 similarly mostly implements architecture-specific hooks: context saving/restoring, syscall support, TLS support.

The patchset allows to boot the system but user interaction with the OS
is not yet possible.

  • Property mode set to 100644
File size: 591 bytes
Line 
1#include <arch/arch.h>
2
3ENTRY(start)
4
5SECTIONS {
6 . = 0x0;
7 .text : {
8 HIDDEN(loader_start = .);
9 *(BOOTSTRAP);
10 *(.text);
11 }
12 .dynamic : { *(.dynamic); }
13 .rela.got : { *(.rela.got); }
14 .hash : { *(.hash); }
15 .dynsym : { *(.dynsym); }
16 .dynstr : { *(.dynstr); }
17 . = 0x8000;
18 .data : {
19 *(.data*); /* initialized data */
20 *(.rodata*);
21 *(.bss); /* uninitialized static variables */
22 *(COMMON); /* global variables */
23 *(.got .got.plt);
24 HIDDEN(loader_end = .);
25 HIDDEN(payload_start = .);
26 *(.payload);
27 HIDDEN(payload_end = .);
28 }
29
30 /DISCARD/ : {
31 *(*);
32 }
33}
Note: See TracBrowser for help on using the repository browser.