/*
 * 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 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));
}
