1 /*
2 * Copyright 2014, General Dynamics C4 Systems
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6
7 #include <types.h>
8 #include <machine/registerset.h>
9 #include <arch/machine.h>
10 #include <plat/machine/hardware.h>
11
getRestartPC(tcb_t * thread)12 word_t PURE getRestartPC(tcb_t *thread)
13 {
14 return getRegister(thread, FaultIP);
15 }
16
setNextPC(tcb_t * thread,word_t v)17 void setNextPC(tcb_t *thread, word_t v)
18 {
19 setRegister(thread, NEXT_PC_REG, v);
20 }
21
map_kernel_devices(void)22 BOOT_CODE void map_kernel_devices(void)
23 {
24 /* If there are no kernel device frames at all, then kernel_device_frames is
25 * NULL. Thus we can't use ARRAY_SIZE(kernel_device_frames) here directly,
26 * but have to use NUM_KERNEL_DEVICE_FRAMES that is defined accordingly.
27 */
28 for (int i = 0; i < NUM_KERNEL_DEVICE_FRAMES; i++) {
29 const kernel_frame_t *frame = &kernel_device_frames[i];
30 /* all frames are supposed to describe device memory, so they should
31 * never be marked as executable.
32 */
33 assert(frame->armExecuteNever);
34 map_kernel_frame(frame->paddr, frame->pptr, VMKernelOnly,
35 vm_attributes_new(frame->armExecuteNever, false,
36 false));
37 if (!frame->userAvailable) {
38 reserve_region((p_region_t) {
39 .start = frame->paddr,
40 .end = frame->paddr + BIT(PAGE_BITS)
41 });
42 }
43 }
44 }
45
46