Subversion Repositories HelenOS

Rev

Rev 1816 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1816 Rev 1824
Line 34... Line 34...
34
 
34
 
35
#include <arch.h>
35
#include <arch.h>
36
 
36
 
37
#include <arch/types.h>
37
#include <arch/types.h>
38
#include <typedefs.h>
38
#include <typedefs.h>
-
 
39
#include <align.h>
39
 
40
 
40
#include <arch/pm.h>
41
#include <arch/pm.h>
41
 
42
 
42
#include <arch/drivers/xconsole.h>
43
#include <arch/drivers/xconsole.h>
-
 
44
#include <arch/mm/page.h>
43
 
45
 
44
#include <arch/context.h>
46
#include <arch/context.h>
45
 
47
 
46
#include <config.h>
48
#include <config.h>
47
 
49
 
Line 58... Line 60...
58
#include <proc/thread.h>
60
#include <proc/thread.h>
59
#include <syscall/syscall.h>
61
#include <syscall/syscall.h>
60
#include <console/console.h>
62
#include <console/console.h>
61
 
63
 
62
start_info_t start_info;
64
start_info_t start_info;
-
 
65
memzone_t meminfo;
-
 
66
 
-
 
67
void arch_pre_main(void)
-
 
68
{
-
 
69
    xen_vm_assist(VMASST_CMD_ENABLE, VMASST_TYPE_WRITABLE_PAGETABLES);
-
 
70
   
-
 
71
    pte_t pte;
-
 
72
    memsetb((uintptr_t) &pte, sizeof(pte), 0);
-
 
73
   
-
 
74
    pte.present = 1;
-
 
75
    pte.writeable = 1;
-
 
76
    pte.frame_address = ADDR2PFN((uintptr_t) start_info.shared_info);
-
 
77
    xen_update_va_mapping(&shared_info, pte, UVMF_INVLPG);
-
 
78
   
-
 
79
    /* Create identity mapping */
-
 
80
   
-
 
81
    meminfo.start = ADDR2PFN(ALIGN_UP(KA2PA(start_info.ptl0), PAGE_SIZE)) + start_info.pt_frames;
-
 
82
    meminfo.size = start_info.frames - meminfo.start;
-
 
83
    meminfo.reserved = 0;
-
 
84
   
-
 
85
    uintptr_t pa;
-
 
86
    index_t last_ptl0 = 0;
-
 
87
    for (pa = PFN2ADDR(meminfo.start); pa < PFN2ADDR(meminfo.start + meminfo.size); pa += FRAME_SIZE) {
-
 
88
        uintptr_t va = PA2KA(pa);
-
 
89
       
-
 
90
        if ((PTL0_INDEX(va) != last_ptl0) && (GET_PTL1_FLAGS(start_info.ptl0, PTL0_INDEX(va)) & PAGE_NOT_PRESENT)) {
-
 
91
            /* New page directory entry needed */
-
 
92
            uintptr_t tpa = PFN2ADDR(meminfo.start + meminfo.reserved);
-
 
93
            uintptr_t tva = PA2KA(tpa);
-
 
94
           
-
 
95
            memsetb(tva, PAGE_SIZE, 0);
-
 
96
           
-
 
97
            pte_t *tptl3 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(start_info.ptl0, PTL0_INDEX(tva)));
-
 
98
            SET_FRAME_FLAGS(tptl3, PTL3_INDEX(tva), PAGE_PRESENT);
-
 
99
            SET_PTL1_ADDRESS(start_info.ptl0, PTL0_INDEX(va), tpa);
-
 
100
           
-
 
101
            last_ptl0 = PTL0_INDEX(va);
-
 
102
            meminfo.reserved++;
-
 
103
        }
-
 
104
       
-
 
105
        pte_t *ptl3 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(start_info.ptl0, PTL0_INDEX(va)));
-
 
106
       
-
 
107
        SET_FRAME_ADDRESS(ptl3, PTL3_INDEX(va), pa);
-
 
108
        SET_FRAME_FLAGS(ptl3, PTL3_INDEX(va), PAGE_PRESENT | PAGE_WRITE);
-
 
109
    }
-
 
110
}
63
 
111
 
64
void arch_pre_mm_init(void)
112
void arch_pre_mm_init(void)
65
{
113
{
66
    pm_init();
114
    pm_init();
67
 
115