| /* |
| * Copyright 2018 The Hafnium Authors. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * https://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "hf/layout.h" |
| |
| #include "hf/std.h" |
| |
| /** |
| * Get the address the .text section begins at. |
| */ |
| paddr_t layout_text_begin(void) |
| { |
| extern uint8_t text_begin[]; |
| |
| return pa_init((uintpaddr_t)text_begin); |
| } |
| |
| /** |
| * Get the address the .text section ends at. |
| */ |
| paddr_t layout_text_end(void) |
| { |
| extern uint8_t text_end[]; |
| |
| return pa_init((uintpaddr_t)text_end); |
| } |
| |
| /** |
| * Get the address the .rodata section begins at. |
| */ |
| paddr_t layout_rodata_begin(void) |
| { |
| extern uint8_t rodata_begin[]; |
| |
| return pa_init((uintpaddr_t)rodata_begin); |
| } |
| |
| /** |
| * Get the address the .rodata section ends at. |
| */ |
| paddr_t layout_rodata_end(void) |
| { |
| extern uint8_t rodata_end[]; |
| |
| return pa_init((uintpaddr_t)rodata_end); |
| } |
| |
| /** |
| * Get the address the .data section begins at. |
| */ |
| paddr_t layout_data_begin(void) |
| { |
| extern uint8_t data_begin[]; |
| |
| return pa_init((uintpaddr_t)data_begin); |
| } |
| |
| /** |
| * Get the address the .data section ends at. |
| */ |
| paddr_t layout_data_end(void) |
| { |
| extern uint8_t data_end[]; |
| |
| return pa_init((uintpaddr_t)data_end); |
| } |
| |
| /** |
| * Get the address the .initrd section begins at. |
| */ |
| paddr_t layout_initrd_begin(void) |
| { |
| extern uint8_t initrd_begin[]; |
| |
| return pa_init((uintpaddr_t)initrd_begin); |
| } |
| |
| /** |
| * Get the address the .initrd section ends at. |
| */ |
| paddr_t layout_initrd_end(void) |
| { |
| extern uint8_t initrd_end[]; |
| |
| return pa_init((uintpaddr_t)initrd_end); |
| } |
| |
| /** |
| * Get the address the .fdt section begins at. |
| */ |
| paddr_t layout_fdt_begin(void) |
| { |
| extern uint8_t fdt_begin[]; |
| |
| return pa_init((uintpaddr_t)fdt_begin); |
| } |
| |
| /** |
| * Get the address the .fdt section ends at. |
| */ |
| paddr_t layout_fdt_end(void) |
| { |
| extern uint8_t fdt_end[]; |
| |
| return pa_init((uintpaddr_t)fdt_end); |
| } |
| |
| /** |
| * Get the address the loaded image ends at. |
| */ |
| paddr_t layout_image_end(void) |
| { |
| extern uint8_t image_end[]; |
| |
| return pa_init((uintpaddr_t)image_end); |
| } |
| |
| /** |
| * Get the address to load the primary VM at. |
| * |
| * This is placed just after the image. |
| */ |
| paddr_t layout_primary_begin(void) |
| { |
| paddr_t image_end = layout_image_end(); |
| |
| /* |
| * Linux usually expects to be loaded at offset 0x80000 into a 2MB |
| * aligned address. |
| * TODO: This is a hack, and isn't always correct. We should really read |
| * the alignment from the header of the binary, or have a bootloader |
| * within the VM do so. |
| */ |
| return pa_init(align_up(pa_addr(image_end), LINUX_ALIGNMENT) + |
| LINUX_OFFSET); |
| } |