1/* 2 * Copyright 2014, General Dynamics C4 Systems 3 * 4 * SPDX-License-Identifier: GPL-2.0-only 5 */ 6 7#pragma once 8 9#include <machine.h> 10#include <plat/machine/hardware.h> 11#include <arch/types.h> 12#include <util.h> 13 14#ifndef __ASSEMBLER__ 15 16int get_num_avail_p_regs(void); 17const p_region_t *get_avail_p_regs(void); 18int get_num_dev_p_regs(void); 19p_region_t get_dev_p_reg(word_t i); 20void map_kernel_devices(void); 21 22void initL2Cache(void); 23 24void initIRQController(void); 25void cpu_initLocalIRQController(void); 26void setIRQTrigger(irq_t irq, bool_t trigger); 27#ifdef ENABLE_SMP_SUPPORT 28void setIRQTarget(irq_t irq, seL4_Word target); 29#endif 30 31static inline void plat_cleanL2Range(paddr_t start, paddr_t end); 32static inline void plat_invalidateL2Range(paddr_t start, paddr_t end); 33static inline void plat_cleanInvalidateL2Range(paddr_t start, paddr_t end); 34static inline void plat_cleanInvalidateL2Cache(void); 35 36void cleanInvalidateCacheRange_RAM(word_t start, word_t end, paddr_t pstart); 37void cleanCacheRange_RAM(word_t start, word_t end, paddr_t pstart); 38void cleanCacheRange_PoU(word_t start, word_t end, paddr_t pstart); 39void invalidateCacheRange_RAM(word_t start, word_t end, paddr_t pstart); 40void invalidateCacheRange_I(word_t start, word_t end, paddr_t pstart); 41void branchFlushRange(word_t start, word_t end, paddr_t pstart); 42 43void clean_D_PoU(void); 44void cleanInvalidate_D_PoC(void); 45void cleanInvalidate_L1D(void); 46void cleanCaches_PoU(void); 47void cleanInvalidateL1Caches(void); 48 49/* Cleaning memory before user-level access */ 50static inline void clearMemory(word_t *ptr, word_t bits) 51{ 52 memzero(ptr, BIT(bits)); 53 cleanCacheRange_PoU((word_t)ptr, (word_t)ptr + BIT(bits) - 1, 54 addrFromPPtr(ptr)); 55} 56 57static inline void clearMemoryRAM(word_t *ptr, word_t bits) 58{ 59 memzero(ptr, BIT(bits)); 60 cleanCacheRange_RAM((word_t)ptr, (word_t)ptr + BIT(bits) - 1, 61 addrFromPPtr(ptr)); 62} 63 64#ifdef ENABLE_SMP_SUPPORT 65static inline void arch_pause(void) 66{ 67 /* TODO */ 68} 69#endif /* ENABLE_SMP_SUPPORT */ 70 71static inline void Arch_finaliseInterrupt(void) 72{ 73} 74 75/* Update the value of the actual regsiter to hold the expected value */ 76static inline exception_t Arch_setTLSRegister(word_t tls_base) 77{ 78 /* This register is saved and restored on kernel exit and entry so 79 * we only update it in the saved context. */ 80 setRegister(NODE_STATE(ksCurThread), TLS_BASE, tls_base); 81 return EXCEPTION_NONE; 82} 83 84#endif /* __ASSEMBLER__ */ 85 86