blob: 003a8ab8fb1d0bf2d6ba7f2766b5d6df4a673689 [file] [log] [blame]
/*
* Copyright 2018 Google LLC
*
* 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"
/**
* 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_bin_end(void)
{
extern uint8_t bin_end[];
return pa_init((uintpaddr_t)bin_end);
}
/**
* Get the address to load the primary VM at.
*
* This is placed just after the image.
*/
paddr_t layout_primary_begin(void)
{
/* TODO: This is a hack. We must read the alignment from the binary. */
paddr_t bin_end = layout_bin_end();
return pa_init((pa_addr(bin_end) + 0x80000 - 1) & ~(0x80000 - 1));
}