vhpt.c

Go to the documentation of this file.
00001 /*
00002 * Copyright (C) 2006 Jakub Vana
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 
00036 #include <arch/mm/vhpt.h>
00037 #include <mm/frame.h>
00038 #include <print.h>
00039 
00040 
00041 static vhpt_entry_t* vhpt_base;
00042 
00043 __address vhpt_set_up(void)
00044 {
00045         vhpt_base=(vhpt_entry_t*) PA2KA(PFN2ADDR(frame_alloc(VHPT_WIDTH-FRAME_WIDTH,FRAME_KA)));
00046         if(!vhpt_base) panic("Kernel configured with VHPT but no memory for table.");
00047         vhpt_invalidate_all();
00048         return (__address) vhpt_base;
00049 }
00050 
00051 
00052 void vhpt_mapping_insert(__address va, asid_t asid, tlb_entry_t entry)
00053 {
00054         region_register rr_save, rr;
00055         index_t vrn;
00056         rid_t rid;
00057         __u64 tag;
00058 
00059         vhpt_entry_t *ventry;
00060 
00061 
00062         vrn = va >> VRN_SHIFT;
00063         rid = ASID2RID(asid, vrn);
00064                                                                                                                                                                                                                                 
00065   rr_save.word = rr_read(vrn);
00066   rr.word = rr_save.word;
00067   rr.map.rid = rid;
00068   rr_write(vrn, rr.word);
00069   srlz_i();
00070         
00071         ventry = (vhpt_entry_t *) thash(va);
00072   tag = ttag(va);
00073   rr_write(vrn, rr_save.word);
00074   srlz_i();
00075   srlz_d();
00076 
00077         ventry->word[0]=entry.word[0];
00078         ventry->word[1]=entry.word[1];
00079         ventry->present.tag.tag_word = tag;
00080         
00081 
00082 }
00083 
00084 void vhpt_invalidate_all()
00085 {
00086         memsetb((__address)vhpt_base,1<<VHPT_WIDTH,0);
00087 }
00088 
00089 void vhpt_invalidate_asid(asid_t asid)
00090 {
00091         vhpt_invalidate_all();
00092 }
00093 
00094 
00095 

Generated on Sun Jun 18 16:51:20 2006 for HelenOS Kernel (ia64) by  doxygen 1.4.6