Linux preempt-rt

Check our new training course

Real-Time Linux with PREEMPT_RT

Check our new training course
with Creative Commons CC-BY-SA
lecture and lab materials

Bootlin logo

Elixir Cross Referencer

/*
 * Copyright (c) 2021 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Backing store on qemu_x86_tiny for testing
 *
 * This uses the "flash" memory area (in DTS) as the backing store
 * for demand paging. The qemu_x86_tiny.ld linker script puts
 * the symbols outside of boot and pinned sections into the flash
 * area, allowing testing of the demand paging mechanism on
 * code and data.
 */

#include <mmu.h>
#include <string.h>
#include <kernel_arch_interface.h>
#include <linker/linker-defs.h>
#include <sys/util.h>

void *location_to_flash(uintptr_t location)
{
	uintptr_t ptr = location;

	/* Offset from start of virtual address space */
	ptr -= CONFIG_KERNEL_VM_BASE + CONFIG_KERNEL_VM_OFFSET;

	/* Translate the offset into address to flash */
	ptr += CONFIG_FLASH_BASE_ADDRESS;

	__ASSERT_NO_MSG(ptr >= CONFIG_FLASH_BASE_ADDRESS);
	__ASSERT_NO_MSG(ptr < (CONFIG_FLASH_BASE_ADDRESS
			       + KB(CONFIG_FLASH_SIZE)
			       - CONFIG_MMU_PAGE_SIZE));

	return UINT_TO_POINTER(ptr);
}

int k_mem_paging_backing_store_location_get(struct z_page_frame *pf,
					    uintptr_t *location,
					    bool page_fault)
{
	/* Simply returns the virtual address */
	*location = POINTER_TO_UINT(pf->addr);

	return 0;
}

void k_mem_paging_backing_store_location_free(uintptr_t location)
{
	/* Nothing to do */
}

void k_mem_paging_backing_store_page_out(uintptr_t location)
{
	(void)memcpy(location_to_flash(location), Z_SCRATCH_PAGE,
		     CONFIG_MMU_PAGE_SIZE);
}

void k_mem_paging_backing_store_page_in(uintptr_t location)
{
	(void)memcpy(Z_SCRATCH_PAGE, location_to_flash(location),
		     CONFIG_MMU_PAGE_SIZE);
}

void k_mem_paging_backing_store_page_finalize(struct z_page_frame *pf,
					      uintptr_t location)
{
	/* Nothing to do */
}

void k_mem_paging_backing_store_init(void)
{
	/* Nothing to do */
}