Subversion Repositories HelenOS

Rev

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

Rev 1809 Rev 1816
Line 75... Line 75...
75
    }
75
    }
76
 
76
 
77
    paging_on();
77
    paging_on();
78
}
78
}
79
 
79
 
80
 
-
 
81
uintptr_t hw_map(uintptr_t physaddr, size_t size)
-
 
82
{
-
 
83
    if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH))
-
 
84
        panic("Unable to map physical memory %p (%d bytes)", physaddr, size)
-
 
85
   
-
 
86
    uintptr_t virtaddr = PA2KA(last_frame);
-
 
87
    pfn_t i;
-
 
88
    for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++)
-
 
89
        page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE);
-
 
90
   
-
 
91
    last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE);
-
 
92
   
-
 
93
    return virtaddr;
-
 
94
}
-
 
95
 
-
 
96
void page_fault(int n, istate_t *istate)
80
void page_fault(int n, istate_t *istate)
97
{
81
{
98
        uintptr_t page;
82
    uintptr_t page;
99
    pf_access_t access;
83
    pf_access_t access;
100
   
84
   
101
        page = read_cr2();
85
    page = read_cr2();
102
       
86
   
103
        if (istate->error_word & PFERR_CODE_RSVD)
87
    if (istate->error_word & PFERR_CODE_RSVD)
104
        panic("Reserved bit set in page directory.\n");
88
        panic("Reserved bit set in page directory.\n");
105
 
89
   
106
    if (istate->error_word & PFERR_CODE_RW)
90
    if (istate->error_word & PFERR_CODE_RW)
107
        access = PF_ACCESS_WRITE;
91
        access = PF_ACCESS_WRITE;
108
    else
92
    else
109
        access = PF_ACCESS_READ;
93
        access = PF_ACCESS_READ;
110
 
94
   
111
        if (as_page_fault(page, access, istate) == AS_PF_FAULT) {
95
    if (as_page_fault(page, access, istate) == AS_PF_FAULT) {
112
        fault_if_from_uspace(istate, "Page fault: %#x", page);
96
        fault_if_from_uspace(istate, "Page fault: %#x", page);
113
 
97
       
114
                PRINT_INFO_ERRCODE(istate);
98
        PRINT_INFO_ERRCODE(istate);
115
                printf("page fault address: %#x\n", page);
99
        printf("page fault address: %#x\n", page);
116
                panic("page fault\n");
100
        panic("page fault\n");
117
        }
101
    }
118
}
102
}
119
 
103
 
120
/** @}
104
/** @}
121
 */
105
 */