# Copyright Microsoft and CHERIoT Contributors.
# SPDX-License-Identifier: MIT

@mmio@

SECTIONS
{
	. = @code_start@;
	_start = .;

	.loader_start :
	{
		*(.loader_start);
	}

	@thread_trusted_stacks@

	__stack_space_start = .;
	@thread_stacks@
	__stack_space_end = .;

	.compartment_export_tables : ALIGN(8)
	{
		# The scheduler and allocator's export tables are at the start.
		.scheduler_export_table = .;
		*.scheduler.compartment(.compartment_export_table);
		.scheduler_export_table_end = .;

		.allocator_export_table = ALIGN(8);
		*/cheriot.allocator.compartment(.compartment_export_table);
		.allocator_export_table_end = .;

		@compartment_exports@
	}


	__compart_pccs = .;

	compartment_switcher_code : CAPALIGN
	{
		.compartment_switcher_start = .;
		*/switcher/entry.S.o(.text);
	}
	.compartment_switcher_end = .;

	scheduler_code : CAPALIGN
	{
		.scheduler_start = .;
		*.scheduler.compartment(.compartment_import_table);
		.scheduler_import_end = .;
		*.scheduler.compartment(.text .text.* .rodata .rodata.* .data.rel.ro);
	}
	.scheduler_end = .;

	allocator_code : CAPALIGN
	{
		.allocator_start = .;
		*/cheriot.allocator.compartment(.compartment_import_table);
		.allocator_import_end = .;
		allocator.compartment(.text .text.* .rodata .rodata.* .data.rel.ro);
		*/cheriot.allocator.compartment(.text .text.* .rodata .rodata.* .data.rel.ro);
	}
	.allocator_end = .;


	token_library_code : CAPALIGN
	{
		.token_library_start = .;
		*/cheriot.token_library.library(.compartment_import_table);
		.token_library_import_end = .;
		token_library.library(.text .text.* .rodata .rodata.* .data.rel.ro);
		*/cheriot.token_library.library(.text .text.* .rodata .rodata.* .data.rel.ro);
	}
	.token_library_end = .;


	@software_revoker_code@

	@pcc_ld@

	__compart_pccs_end = .;

	__compart_cgps = ALIGN(64);

	.scheduler_globals : CAPALIGN
	{
		.scheduler_globals = .;
		*.scheduler.compartment(.data .data.* .sdata .sdata.*);
		.scheduler_bss_start = .;
		*.scheduler.compartment(.sbss .sbss.* .bss .bss.*)
	}
	.scheduler_globals_end = .;

	.allocator_sealed_objects : CAPALIGN
	{
		.allocator_sealed_objects = .;
		*/cheriot.allocator.compartment(.sealed_objects)
	}
	.allocator_sealed_objects_end = .;

	.allocator_globals : CAPALIGN
	{
		.allocator_globals = .;
		*/cheriot.allocator.compartment(.data .data.* .sdata .sdata.*);
		.allocator_bss_start = .;
		*/cheriot.allocator.compartment(.sbss .sbss.* .bss .bss.*);
	}
	.allocator_globals_end = .;


	@software_revoker_globals@

	@gdc_ld@

	__compart_cgps_end = .;

	.sealed_objects :
	{
		@sealed_objects@
	}

	__shared_objects_start = .;
	@shared_objects@
	__shared_objects_end = .;

	. = ALIGN(64);

	# Everything after this point can be discarded after the loader has
	# finished.
	__export_mem_heap = @heap_start@;

	__cap_relocs :
	{
		__cap_relocs = .;
		# FIXME: This currently doesn't do anything.  The linker creates this
		# entire section.  The linker script needs to be modified to create
		# separate caprelocs sections for each section.
		@cap_relocs@
	}
	__cap_relocs_end = .;

	# Collect all compartment headers
	.compartment_headers : ALIGN(4)
	{
		__compart_headers = .;
		# Loader code start
		LONG(.loader_code_start);
		# Loader code length
		SHORT(.loader_code_end - .loader_code_start);
		# Loader data start
		LONG(.loader_data_start);
		# Loader data length
		SHORT(.loader_data_end - .loader_data_start);

		# Compartment switcher start address
		LONG(.compartment_switcher_start);
		# Compartment switcher end
		SHORT(.compartment_switcher_end - .compartment_switcher_start);
		# Compartment switcher sealing key
		SHORT(compartment_switcher_sealing_key - .compartment_switcher_start);
		# Switcher's copy of the scheduler's PCC.
		SHORT(switcher_scheduler_entry_pcc - .compartment_switcher_start);
		# Switcher's copy of the scheduler's CGP
		SHORT(switcher_scheduler_entry_cgp - .compartment_switcher_start);
		# Switcher's copy of the scheduler's CSP
		SHORT(switcher_scheduler_entry_csp - .compartment_switcher_start);
		# Address of switcher export table
		LONG(.switcher_export_table);
		# Size of the switcher export table
		SHORT(.switcher_export_table_end - .switcher_export_table);

		# sdk/core/loader/types.h:/PrivilegedCompartment
		# Scheduler code start address
		LONG(.scheduler_start);
		# Scheduler code end
		SHORT(.scheduler_end - .scheduler_start);
		# Scheduler globals start address
		LONG(.scheduler_globals);
		# Scheduler globals end size
		SHORT(SIZEOF(.scheduler_globals));
		# Size of the scheduler import table
		SHORT(.scheduler_import_end - .scheduler_start);
		# Address of scheduler export table
		LONG(.scheduler_export_table);
		# Size of the scheduler export table
		SHORT(.scheduler_export_table_end - .scheduler_export_table);
		# No sealed objects
		LONG(0);
		SHORT(0);

		# sdk/core/loader/types.h:/PrivilegedCompartment
		# Allocator code start address
		LONG(.allocator_start);
		# Allocator code end
		SHORT(.allocator_end - .allocator_start);
		# Allocator globals start address
		LONG(.allocator_globals);
		# Allocator globals end
		SHORT(SIZEOF(.allocator_globals));
		# Size of the allocator import table
		SHORT(.allocator_import_end - .allocator_start);
		# Address of allocator export table
		LONG(.allocator_export_table);
		# Size of the allocator export table
		SHORT(.allocator_export_table_end - .allocator_export_table);
		# The allocator may have sealed objects
		LONG(.allocator_sealed_objects);
		SHORT(SIZEOF(.allocator_sealed_objects));

		# sdk/core/loader/types.h:/PrivilegedCompartment
		# Token server compartment header
		# Code
		LONG(.token_library_start);
		SHORT(.token_library_end - .token_library_start);
		# No data segment
		LONG(0);
		SHORT(0);
		# Size of the token server import table
		SHORT(.token_library_import_end - .token_library_start);
		# Address of the token server export table
		LONG(.token_library_export_table);
		# Size of the token server export table
		SHORT(.token_library_export_table_end - .token_library_export_table);
		# No sealed objects
		LONG(0);
		SHORT(0);

		@software_revoker_header@

		# sdk/core/loader/types.h:/is_magic_valid
		# Magic number, used to detect mismatches between linker script and
		# loader versions.
		# New versions of this can be generated with:
		# head /dev/random | shasum | cut -c 0-8
		LONG(0x6cef3879);
		# Number of library headers.
		SHORT(@library_count@);
		# Number of compartment headers.
		SHORT(@compartment_count@);
		@compartment_headers@
	}

	# Thread configuration.  This follows the compartment headers but is in a
	# separate section to make auditing easier.
	# This section holds a `class ThreadInfo` (loader/types.h)
	.thread_config :
	{
		.thread_config_start = .;
		# Number of threads
		__thread_count = .;
		SHORT(@thread_count@);
		# The thread structures
		@thread_headers@
		__compart_headers_end = .;
	}


	.loader_code : CAPALIGN
	{
		.loader_code_start = .;
		*/loader/boot.cc.o(.text .text.* .rodata .rodata.* .data.rel.ro);
	}
	.loader_code_end = .;

	.loader_data : CAPALIGN
	{
		.loader_data_start = .;
		*/loader/boot.cc.o(.data .data.* .sdata .sdata.* .sbss .sbss.* .bss .bss.*);
	}
	.loader_data_end = .;

	.library_export_tables : ALIGN(8)
	{
		.token_library_export_table = ALIGN(8);
		*/cheriot.token_library.library(.compartment_export_table);
		.token_library_export_table_end = .;

		.switcher_export_table = ALIGN(8);
		*/switcher/entry.S.o(.compartment_export_table);
		.switcher_export_table_end = .;

		@library_exports@
	}

}
# No symbols should be exported
VERSION {
	VERSION_1 {
		local: *;
	};
};
