/*
 * 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"

#include "hf/arch/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_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(align_up(pa_addr(bin_end), 0x80000));
}
