Subversion Repositories HelenOS

Rev

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

Rev 2278 Rev 2284
Line 36... Line 36...
36
#include <arch/debug_print/print.h>
36
#include <arch/debug_print/print.h>
37
#include <arch/mm/page_fault.h>
37
#include <arch/mm/page_fault.h>
38
#include <mm/as.h>
38
#include <mm/as.h>
39
#include <genarch/mm/page_pt.h>
39
#include <genarch/mm/page_pt.h>
40
#include <arch.h>
40
#include <arch.h>
-
 
41
#include <interrupt.h>
41
 
42
 
42
 
43
 
43
//TODO: remove in final version
44
//TODO: remove in final version
44
static void print_istate(istate_t* istate);
45
static void print_istate(istate_t* istate);
45
static void print_istate(istate_t* istate) {
46
static void print_istate(istate_t* istate) {
Line 135... Line 136...
135
        instruction_union_t tmp;
136
        instruction_union_t tmp;
136
        tmp.ip = instr_addr;
137
        tmp.ip = instr_addr;
137
    // get instruction op code
138
    // get instruction op code
138
    instruction_t i_code = *(tmp.instr);
139
    instruction_t i_code = *(tmp.instr);
139
 
140
 
140
        dprintf("get_instruction_memmory_access\n");
141
//         dprintf("get_instruction_memmory_access\n");
141
    dprintf(" instr_addr:%X\n",instr_addr);
142
//  dprintf(" instr_addr:%X\n",instr_addr);
142
    dprintf(" i_code:%X\n",i_code);
143
//  dprintf(" i_code:%X\n",i_code);
143
    dprintf(" i_code.condition:%d\n", i_code.condition);
144
//  dprintf(" i_code.condition:%d\n", i_code.condition);
144
    dprintf(" i_code.instr_type:%d\n",i_code.instr_type);
145
//  dprintf(" i_code.instr_type:%d\n",i_code.instr_type);
145
    dprintf(" i_code.opcode:%d\n",i_code.opcode);
146
//  dprintf(" i_code.opcode:%d\n",i_code.opcode);
146
    dprintf(" i_code.acess:%d\n", i_code.access);
147
//  dprintf(" i_code.acess:%d\n", i_code.access);
147
    dprintf(" i_code.dummy:%d\n", i_code.dummy);
148
//  dprintf(" i_code.dummy:%d\n", i_code.dummy);
148
    dprintf(" i_code.bits567%d\n", i_code.bits567);
149
//  dprintf(" i_code.bits567%d\n", i_code.bits567);
149
    dprintf(" i_code.bit4:%d\n", i_code.bit4);
150
//  dprintf(" i_code.bit4:%d\n", i_code.bit4);
150
    dprintf(" i_code.dummy1:%d\n", i_code.dummy1);
151
//  dprintf(" i_code.dummy1:%d\n", i_code.dummy1);
151
 
152
 
152
 
153
 
153
        // undefined instructions ... (or special instructions)
154
        // undefined instructions ... (or special instructions)
154
    if (i_code.condition == 0xf) {
155
    if (i_code.condition == 0xf) {
155
        panic("page_fault - on instruction not acessing to memmory (instr_code:%X, badvaddr:%X)",i_code, badvaddr);
156
        panic("page_fault - on instruction not acessing to memmory (instr_code:%X, badvaddr:%X)",i_code, badvaddr);
Line 207... Line 208...
207
        fault_status_t fsr = read_fault_status_register();
208
        fault_status_t fsr = read_fault_status_register();
208
        uintptr_t  page = read_fault_address_register();
209
        uintptr_t  page = read_fault_address_register();
209
 
210
 
210
    pf_access_t access = get_memmory_access_type( istate->lr, page);
211
    pf_access_t access = get_memmory_access_type( istate->lr, page);
211
 
212
 
212
    print_istate(istate);
213
//  print_istate(istate);
213
    dprintf(" page fault : ip:%X, va:%X, status:%x(%x), access:%d\n", istate->lr, page, fsr.status,fsr, access);
214
    dprintf(" page fault : ip:%X, va:%X, status:%x(%x), access:%d\n", istate->lr, page, fsr.status,fsr, access);
214
 
215
 
215
/* Alf: Will be commented until stack problem will be solved ...
216
/* Alf: Will be commented until stack problem will be solved ...
216
    as_page_fault make consequent page faults
217
    as_page_fault make consequent page faults*/
217
 
218
 
218
        int ret = as_page_fault(page, access, istate);
219
        int ret = as_page_fault(page, access, istate);
219
    dprintf(" as_page_fault ret:%d\n", ret);
220
    dprintf(" as_page_fault ret:%d\n", ret);
220
        if (ret == AS_PF_FAULT) {
221
        if (ret == AS_PF_FAULT) {
221
        fault_if_from_uspace(istate, "Page fault: %#x", page);
222
        fault_if_from_uspace(istate, "Page fault: %#x", page);
222
 
223
 
223
                panic("page fault\n");
224
                panic("page fault\n");
224
        }
225
        }
225
*/
226
 
226
    // TODO: Remove this ... now for testing purposes ... it's bad to test page faults in kernel, where no page faults should occures
227
    // TODO: Remove this ... now for testing purposes ... it's bad to test page faults in kernel, where no page faults should occures
227
    panic("page fault ... solved\n");
228
    panic("page fault ... solved\n");
228
 
229
 
229
}
230
}
230
 
231
 
Line 238... Line 239...
238
 // Prefetch can be made be bkpt instruction
239
 // Prefetch can be made be bkpt instruction
239
    print_istate(istate);
240
    print_istate(istate);
240
    dprintf(" prefetch_abourt ... instruction on adress:%x can't be fetched\n", istate->lr);
241
    dprintf(" prefetch_abourt ... instruction on adress:%x can't be fetched\n", istate->lr);
241
 
242
 
242
/* Alf: Will be commented until stack problem will be solved ...
243
/* Alf: Will be commented until stack problem will be solved ...
243
    as_page_fault make consequent page faults
244
    as_page_fault make consequent page faults*/
244
 
245
 
245
    int ret = as_page_fault(istate->lr, PF_ACCESS_EXEC, istate);
246
    int ret = as_page_fault(istate->lr, PF_ACCESS_EXEC, istate);
246
    dprintf(" as_page_fault ret:%d\n", ret);
247
    dprintf(" as_page_fault ret:%d\n", ret);
247
        if (ret == AS_PF_FAULT) {
248
        if (ret == AS_PF_FAULT) {
248
                panic("page fault - instruction fetch at addr:%X\n", istate->lr);
249
                panic("page fault - instruction fetch at addr:%X\n", istate->lr);
249
        }
250
        }
250
*/
251
 
251
 
252
 
252
    panic("Prefetch abourt ... solved");
253
    panic("Prefetch abourt ... solved");
253
}
254
}
254
 
255
 
255
/** @}
256
/** @}