page.c

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2005 Jakub Jermar
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  *
00009  * - Redistributions of source code must retain the above copyright
00010  *   notice, this list of conditions and the following disclaimer.
00011  * - Redistributions in binary form must reproduce the above copyright
00012  *   notice, this list of conditions and the following disclaimer in the
00013  *   documentation and/or other materials provided with the distribution.
00014  * - The name of the author may not be used to endorse or promote products
00015  *   derived from this software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
00018  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00019  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00020  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00021  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
00022  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00023  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00024  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00025  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00026  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00027  */
00028 
00035 #include <arch/mm/page.h>
00036 #include <arch/mm/tlb.h>
00037 #include <genarch/mm/page_ht.h>
00038 #include <mm/frame.h>
00039 #include <bitops.h>
00040 #include <debug.h>
00041 
00042 void page_arch_init(void)
00043 {
00044         page_mapping_operations = &ht_mapping_operations;
00045 }
00046 
00047 __address hw_map(__address physaddr, size_t size)
00048 {
00049         unsigned int order;
00050         int i;
00051 
00052         struct {
00053                 int pagesize;
00054                 size_t increment;
00055                 count_t count;
00056         } sizemap[] = {
00057                 { PAGESIZE_8K, 0, 1 },                  /* 8K */
00058                 { PAGESIZE_8K, PAGE_SIZE, 2 },          /* 16K */
00059                 { PAGESIZE_8K, PAGE_SIZE, 4 },          /* 32K */
00060                 { PAGESIZE_64K, 0, 1},                  /* 64K */
00061                 { PAGESIZE_64K, 8*PAGE_SIZE, 2 },       /* 128K */
00062                 { PAGESIZE_64K, 8*PAGE_SIZE, 4 },       /* 256K */
00063                 { PAGESIZE_512K, 0, 1 },                /* 512K */
00064                 { PAGESIZE_512K, 64*PAGE_SIZE, 2 },     /* 1M */
00065                 { PAGESIZE_512K, 64*PAGE_SIZE, 4 },     /* 2M */
00066                 { PAGESIZE_4M, 0, 1 }                   /* 4M */
00067         };
00068         
00069         ASSERT(size <= 4*1024*1024);
00070         
00071         if (size <= FRAME_SIZE)
00072                 order = 0;
00073         else
00074                 order = (fnzb32(size - 1) + 1) - FRAME_WIDTH;
00075         
00076         __address virtaddr = PA2KA(PFN2ADDR(frame_alloc(order, FRAME_KA)));
00077 
00078         for (i = 0; i < sizemap[order].count; i++)
00079                 dtlb_insert_mapping(virtaddr + i*sizemap[order].increment,
00080                                     physaddr + i*sizemap[order].increment,
00081                                     sizemap[order].pagesize, true, false);
00082         
00083         return virtaddr;
00084 }
00085 

Generated on Sun Jun 18 17:37:25 2006 for HelenOS Kernel (sparc64) by  doxygen 1.4.6