1 /* $NetBSD: mm.h,v 1.4 2014/12/14 23:48:58 chs Exp $ */ 2 3 /*- 4 * Copyright (c) 2013 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Taylor R. Campbell. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #ifndef _LINUX_MM_H_ 33 #define _LINUX_MM_H_ 34 35 #include <sys/kauth.h> 36 #include <sys/file.h> 37 #include <sys/mman.h> 38 #include <sys/proc.h> 39 #include <sys/vnode.h> 40 41 #include <miscfs/specfs/specdev.h> 42 43 #include <uvm/uvm_extern.h> 44 45 #include <asm/page.h> 46 47 /* XXX Ugh bletch! Whattakludge! Linux's sense is reversed... */ 48 #undef PAGE_MASK 49 #define PAGE_MASK (~(PAGE_SIZE-1)) 50 51 #define PAGE_ALIGN(x) (((x) + (PAGE_SIZE-1)) & ~(PAGE_SIZE-1)) 52 #define offset_in_page(x) ((x) & (PAGE_SIZE-1)) 53 54 struct sysinfo { 55 unsigned long totalram; 56 unsigned long totalhigh; 57 uint32_t mem_unit; 58 }; 59 60 static inline void 61 si_meminfo(struct sysinfo *si) 62 { 63 64 si->totalram = uvmexp.npages; 65 si->totalhigh = kernel_map->size >> PAGE_SHIFT; 66 si->mem_unit = PAGE_SIZE; 67 /* XXX Fill in more as needed. */ 68 } 69 70 /* 71 * ################################################################### 72 * ############### XXX THIS NEEDS SERIOUS SCRUTINY XXX ############### 73 * ################################################################### 74 */ 75 76 /* 77 * XXX unsigned long is a loser but will probably work accidentally. 78 * XXX struct file might not map quite right between Linux and NetBSD. 79 * XXX This is large enough it should take its own file. 80 */ 81 82 static inline unsigned long 83 vm_mmap(struct file *file, unsigned long base, unsigned long size, 84 unsigned long prot, unsigned long flags, unsigned long token) 85 { 86 struct vnode *vp; 87 void *addr; 88 int error; 89 90 /* 91 * Cargo-culted from sys_mmap. Various conditions kasserted 92 * rather than checked for expedience and safey. 93 */ 94 95 KASSERT(base == 0); 96 KASSERT(prot == (PROT_READ | PROT_WRITE)); 97 KASSERT(flags == MAP_SHARED); 98 99 KASSERT(file->f_type == DTYPE_VNODE); 100 vp = file->f_data; 101 102 KASSERT(vp->v_type == VCHR); 103 KASSERT((file->f_flag & (FREAD | FWRITE)) == (FREAD | FWRITE)); 104 105 /* XXX pax_mprotect? pax_aslr? */ 106 107 addr = NULL; 108 error = uvm_mmap_dev(curproc, &addr, size, vp->v_rdev, (off_t)base); 109 if (error) 110 goto out; 111 112 KASSERT((uintptr_t)addr <= -1024UL); /* XXX Kludgerosity! */ 113 114 out: /* XXX errno NetBSD->Linux (kludgerific) */ 115 return (error? (-error) : (unsigned long)addr); 116 } 117 118 #endif /* _LINUX_MM_H_ */ 119