1 1.24 riastrad /* $NetBSD: mm.h,v 1.24 2021/12/19 12:21:30 riastradh Exp $ */ 2 1.2 riastrad 3 1.2 riastrad /*- 4 1.2 riastrad * Copyright (c) 2013 The NetBSD Foundation, Inc. 5 1.2 riastrad * All rights reserved. 6 1.2 riastrad * 7 1.2 riastrad * This code is derived from software contributed to The NetBSD Foundation 8 1.2 riastrad * by Taylor R. Campbell. 9 1.2 riastrad * 10 1.2 riastrad * Redistribution and use in source and binary forms, with or without 11 1.2 riastrad * modification, are permitted provided that the following conditions 12 1.2 riastrad * are met: 13 1.2 riastrad * 1. Redistributions of source code must retain the above copyright 14 1.2 riastrad * notice, this list of conditions and the following disclaimer. 15 1.2 riastrad * 2. Redistributions in binary form must reproduce the above copyright 16 1.2 riastrad * notice, this list of conditions and the following disclaimer in the 17 1.2 riastrad * documentation and/or other materials provided with the distribution. 18 1.2 riastrad * 19 1.2 riastrad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.2 riastrad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.2 riastrad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.2 riastrad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.2 riastrad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.2 riastrad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.2 riastrad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.2 riastrad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.2 riastrad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.2 riastrad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.2 riastrad * POSSIBILITY OF SUCH DAMAGE. 30 1.2 riastrad */ 31 1.2 riastrad 32 1.2 riastrad #ifndef _LINUX_MM_H_ 33 1.2 riastrad #define _LINUX_MM_H_ 34 1.2 riastrad 35 1.2 riastrad #include <uvm/uvm_extern.h> 36 1.12 skrll #include <uvm/uvm_object.h> 37 1.3 riastrad 38 1.3 riastrad #include <asm/page.h> 39 1.24 riastrad 40 1.24 riastrad #include <linux/pfn.h> 41 1.7 riastrad #include <linux/shrinker.h> 42 1.14 riastrad #include <linux/slab.h> 43 1.17 riastrad #include <linux/sizes.h> 44 1.7 riastrad 45 1.5 riastrad struct file; 46 1.5 riastrad 47 1.2 riastrad /* XXX Ugh bletch! Whattakludge! Linux's sense is reversed... */ 48 1.2 riastrad #undef PAGE_MASK 49 1.2 riastrad #define PAGE_MASK (~(PAGE_SIZE-1)) 50 1.2 riastrad 51 1.2 riastrad #define PAGE_ALIGN(x) (((x) + (PAGE_SIZE-1)) & ~(PAGE_SIZE-1)) 52 1.22 riastrad #define offset_in_page(x) ((uintptr_t)(x) & (PAGE_SIZE-1)) 53 1.2 riastrad 54 1.18 riastrad #define untagged_addr(x) (x) 55 1.18 riastrad 56 1.3 riastrad struct sysinfo { 57 1.3 riastrad unsigned long totalram; 58 1.3 riastrad unsigned long totalhigh; 59 1.3 riastrad uint32_t mem_unit; 60 1.3 riastrad }; 61 1.3 riastrad 62 1.3 riastrad static inline void 63 1.3 riastrad si_meminfo(struct sysinfo *si) 64 1.3 riastrad { 65 1.3 riastrad 66 1.3 riastrad si->totalram = uvmexp.npages; 67 1.3 riastrad si->totalhigh = kernel_map->size >> PAGE_SHIFT; 68 1.3 riastrad si->mem_unit = PAGE_SIZE; 69 1.3 riastrad /* XXX Fill in more as needed. */ 70 1.3 riastrad } 71 1.3 riastrad 72 1.16 riastrad static inline size_t 73 1.16 riastrad si_mem_available(void) 74 1.16 riastrad { 75 1.16 riastrad 76 1.16 riastrad /* XXX ? */ 77 1.16 riastrad return uvmexp.free; 78 1.16 riastrad } 79 1.16 riastrad 80 1.2 riastrad static inline unsigned long 81 1.5 riastrad vm_mmap(struct file *file __unused, unsigned long base __unused, 82 1.5 riastrad unsigned long size __unused, unsigned long prot __unused, 83 1.5 riastrad unsigned long flags __unused, unsigned long token __unused) 84 1.2 riastrad { 85 1.2 riastrad 86 1.5 riastrad return -ENODEV; 87 1.2 riastrad } 88 1.2 riastrad 89 1.6 jmcneill static inline unsigned long 90 1.21 riastrad totalram_pages(void) 91 1.21 riastrad { 92 1.21 riastrad 93 1.21 riastrad return uvmexp.npages; 94 1.21 riastrad } 95 1.21 riastrad 96 1.21 riastrad static inline unsigned long 97 1.6 jmcneill get_num_physpages(void) 98 1.6 jmcneill { 99 1.21 riastrad 100 1.6 jmcneill return uvmexp.npages; 101 1.6 jmcneill } 102 1.6 jmcneill 103 1.14 riastrad static inline void * 104 1.19 riastrad kvmalloc(size_t size, gfp_t gfp) 105 1.19 riastrad { 106 1.19 riastrad 107 1.19 riastrad return kmalloc(size, gfp); 108 1.19 riastrad } 109 1.19 riastrad 110 1.19 riastrad static inline void * 111 1.15 riastrad kvzalloc(size_t size, gfp_t gfp) 112 1.15 riastrad { 113 1.15 riastrad 114 1.15 riastrad return kmalloc(size, gfp | __GFP_ZERO); 115 1.15 riastrad } 116 1.15 riastrad 117 1.15 riastrad static inline void * 118 1.20 riastrad kvcalloc(size_t nelem, size_t elemsize, gfp_t gfp) 119 1.20 riastrad { 120 1.20 riastrad 121 1.20 riastrad KASSERT(elemsize > 0); 122 1.20 riastrad if (SIZE_MAX/elemsize < nelem) 123 1.20 riastrad return NULL; 124 1.20 riastrad return kvzalloc(nelem * elemsize, gfp); 125 1.20 riastrad } 126 1.20 riastrad 127 1.20 riastrad static inline void * 128 1.14 riastrad kvmalloc_array(size_t nelem, size_t elemsize, gfp_t gfp) 129 1.14 riastrad { 130 1.14 riastrad 131 1.14 riastrad KASSERT(elemsize != 0); 132 1.14 riastrad if (nelem > SIZE_MAX/elemsize) 133 1.14 riastrad return NULL; 134 1.14 riastrad return kmalloc(nelem * elemsize, gfp); 135 1.14 riastrad } 136 1.14 riastrad 137 1.9 riastrad /* 138 1.23 riastrad * XXX kvfree must additionally work on kmalloc (linux/slab.h) and 139 1.23 riastrad * vmalloc (linux/vmalloc.h). If you change either of those, be sure 140 1.23 riastrad * to change this too. 141 1.9 riastrad */ 142 1.23 riastrad 143 1.7 riastrad static inline void 144 1.9 riastrad kvfree(void *ptr) 145 1.7 riastrad { 146 1.23 riastrad kfree(ptr); 147 1.7 riastrad } 148 1.7 riastrad 149 1.8 riastrad static inline void 150 1.8 riastrad set_page_dirty(struct page *page) 151 1.8 riastrad { 152 1.11 ad struct vm_page *pg = &page->p_vmp; 153 1.8 riastrad 154 1.11 ad /* XXX */ 155 1.11 ad if (pg->uobject != NULL) { 156 1.13 ad rw_enter(pg->uobject->vmobjlock, RW_WRITER); 157 1.11 ad uvm_pagemarkdirty(pg, UVM_PAGE_STATUS_DIRTY); 158 1.13 ad rw_exit(pg->uobject->vmobjlock); 159 1.11 ad } else { 160 1.11 ad uvm_pagemarkdirty(pg, UVM_PAGE_STATUS_DIRTY); 161 1.11 ad } 162 1.8 riastrad } 163 1.8 riastrad 164 1.2 riastrad #endif /* _LINUX_MM_H_ */ 165