OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [arch/] [sparc64/] [mm/] [modutil.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*  $Id: modutil.c,v 1.1.1.1 2004-04-15 01:33:42 phoenix Exp $
2
 *  arch/sparc64/mm/modutil.c
3
 *
4
 *  Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
5
 *  Based upon code written by Linus Torvalds and others.
6
 */
7
 
8
#include <linux/slab.h>
9
#include <linux/vmalloc.h>
10
 
11
#include <asm/uaccess.h>
12
#include <asm/system.h>
13
 
14
static struct vm_struct *modvmlist = NULL;
15
 
16
void __module_unmap(void *addr, int free_area_pages)
17
{
18
        struct vm_struct **p, *tmp;
19
 
20
        if (!addr)
21
                return;
22
        if ((PAGE_SIZE-1) & (unsigned long) addr) {
23
                printk("Trying to unmap module with bad address (%p)\n", addr);
24
                return;
25
        }
26
        for (p = &modvmlist ; (tmp = *p) ; p = &tmp->next) {
27
                if (tmp->addr == addr) {
28
                        *p = tmp->next;
29
                        if (free_area_pages)
30
                                vmfree_area_pages(VMALLOC_VMADDR(tmp->addr),
31
                                                  tmp->size);
32
                        kfree(tmp);
33
                        return;
34
                }
35
        }
36
        printk("Trying to unmap nonexistent module vm area (%p)\n", addr);
37
}
38
 
39
void module_unmap(void *addr)
40
{
41
        __module_unmap(addr, 1);
42
}
43
 
44
void *module_map (unsigned long size)
45
{
46
        void * addr;
47
        struct vm_struct **p, *tmp, *area;
48
 
49
        size = PAGE_ALIGN(size);
50
        if (!size || size > MODULES_LEN)
51
                return NULL;
52
 
53
        addr = (void *) MODULES_VADDR;
54
        for (p = &modvmlist; (tmp = *p) ; p = &tmp->next) {
55
                if (size + (unsigned long) addr < (unsigned long) tmp->addr)
56
                        break;
57
                addr = (void *) (tmp->size + (unsigned long) tmp->addr);
58
        }
59
        if ((unsigned long) addr + size >= MODULES_END)
60
                return NULL;
61
 
62
        area = (struct vm_struct *) kmalloc(sizeof(*area), GFP_KERNEL);
63
        if (!area)
64
                return NULL;
65
        area->size = size + PAGE_SIZE;
66
        area->addr = addr;
67
        area->next = *p;
68
        *p = area;
69
 
70
        if (vmalloc_area_pages(VMALLOC_VMADDR(addr), size, GFP_KERNEL, PAGE_KERNEL)) {
71
                __module_unmap(addr, 0);
72
                return NULL;
73
        }
74
        return addr;
75
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.