blob: 5cc3fc2b12250afbc4a216d6459f0426e7de3cd5 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors
// Copyright (c) 2014 Travis Geiselbrecht
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#pragma once
#include <arch/defines.h>
// The kernel physmap is a region of the kernel where all of useful physical memory
// is mapped in one large chunk. It's up to the individual architecture to decide
// how much to map but it's usually a fairly large chunk at the base of the kernel
// address space.
#define PHYSMAP_BASE (KERNEL_ASPACE_BASE)
#define PHYSMAP_SIZE (ARCH_PHYSMAP_SIZE)
#define PHYSMAP_BASE_PHYS (0)
#ifndef __ASSEMBLER__
#include <arch.h>
#include <assert.h>
#include <inttypes.h>
#include <vm/vm.h>
#include <zircon/compiler.h>
__BEGIN_CDECLS
// check to see if an address is in the physmap virtually and physically
static inline bool is_physmap_addr(const void* addr) {
return ((uintptr_t)addr >= PHYSMAP_BASE &&
(uintptr_t)addr - PHYSMAP_BASE < PHYSMAP_SIZE);
}
static inline bool is_physmap_phys_addr(paddr_t pa) {
return (
#if PHYSMAP_BASE_PHYS != 0
pa >= PHYSMAP_BASE_PHYS &&
#endif
pa - PHYSMAP_BASE_PHYS < PHYSMAP_SIZE);
}
// physical to virtual, returning pointer in the big kernel map
static inline void* paddr_to_physmap(paddr_t pa) {
DEBUG_ASSERT_MSG(is_physmap_phys_addr(pa), "paddr %#" PRIxPTR "\n", pa);
return (void*)(pa - PHYSMAP_BASE_PHYS + PHYSMAP_BASE);
}
// given a pointer into the physmap, reverse back to a physical address
static inline paddr_t physmap_to_paddr(const void* addr) {
DEBUG_ASSERT_MSG(is_physmap_addr(addr), "vaddr %p\n", addr);
return (uintptr_t)addr - PHYSMAP_BASE + PHYSMAP_BASE_PHYS;
}
__END_CDECLS
#endif // !__ASSEMBLER__