1/* 2 * Copyright 2020, Data61, CSIRO (ABN 41 687 119 230) 3 * 4 * SPDX-License-Identifier: GPL-2.0-only 5 */ 6 7#pragma once 8 9#include <config.h> 10#include <types.h> 11#include <mode/types.h> 12#include <plat_mode/machine/hardware.h> 13#include <arch/kernel/tlb_bitmap_defs.h> 14#include <mode/kernel/vspace.h> 15 16#ifdef ENABLE_SMP_SUPPORT 17 18static inline void tlb_bitmap_init(vspace_root_t *root) 19{ 20 for (int i = 0; i < TLBBITMAP_ROOT_ENTRIES; i++) { 21 root[TLBBITMAP_ROOT_INDEX + i] = x86_make_empty_root_mapping(); 22 } 23} 24 25static inline void tlb_bitmap_set(vspace_root_t *root, word_t cpu) 26{ 27 assert(cpu < TLBBITMAP_ROOT_BITS && cpu <= wordBits); 28 root[TLBBITMAP_ROOT_MAKE_INDEX(cpu)].words[0] |= TLBBITMAP_ROOT_MAKE_BIT(cpu); 29} 30 31static inline void tlb_bitmap_unset(vspace_root_t *root, word_t cpu) 32{ 33 assert(cpu < TLBBITMAP_ROOT_BITS && cpu <= wordBits); 34 root[TLBBITMAP_ROOT_MAKE_INDEX(cpu)].words[0] &= ~TLBBITMAP_ROOT_MAKE_BIT(cpu); 35} 36 37static inline word_t tlb_bitmap_get(vspace_root_t *root) 38{ 39 word_t bitmap = 0; 40 41 for (int i = 0; i < TLBBITMAP_ROOT_ENTRIES; i++) { 42 word_t entry = root[TLBBITMAP_ROOT_INDEX + i].words[0]; 43 // skip present bit 44 entry >>= 1; 45 46 int shift = i * TLBBITMAP_ENTRIES_PER_ROOT; 47 bitmap |= entry << shift; 48 } 49 return bitmap; 50} 51 52#else 53#define TLBBITMAP_ROOT_ENTRIES 0 54#endif /* ENABLE_SMP_SUPPORT */ 55 56