1/** 2 * \file 3 * \brief A paging helper file 4 */ 5 6/* 7 * Copyright (c) 2010, ETH Zurich. 8 * All rights reserved. 9 * 10 * This file is distributed under the terms in the attached LICENSE file. 11 * If you do not find this file, copies can be found by writing to: 12 * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group. 13 */ 14 15#ifndef KERNEL_PAGING_HELPER_H 16#define KERNEL_PAGING_HELPER_H 17 18/** 19 * \brief Align a virtual address 20 * 21 * \param vbase Virtual base address of mapping. 22 * \param base Physical base address of mapping. 23 * \param size Size of mapping in bytes. 24 * \param pagesize Page size in bytes (must be power of 2). 25 */ 26static inline void paging_align(lvaddr_t *vbase, lpaddr_t *base, size_t *size, 27 size_t pagesize) 28{ 29 size_t pagemask = pagesize - 1; 30 31 // XXX: Page size must be power of 2 (we only check divisibility by 2). 32 assert(pagesize % 2 == 0); 33 34 // Align vbase to page size 35 if(*vbase & pagemask) { 36 *size += *vbase & pagemask; 37 *vbase -= *vbase & pagemask; 38 } 39 40 // Check whether base is aligned 41// assert(((*base) & pagemask) == 0); 42 // Align base to page size 43 if(base != NULL && (*base & pagemask)) { 44 printk(LOG_WARN, "Given paddr %" PRIxLPADDR " unaligned to system " 45 "page size %zu\n", *base, pagesize); 46 /* *base -= *base & pagemask; */ 47 } 48 49 // Align size to page size 50 if(*size & pagemask) { 51 *size += pagesize - (*size & pagemask); 52 } 53} 54 55#endif 56