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