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