- Timestamp:
- 2006-05-24T17:03:29Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8d6bc2d5
- Parents:
- 82da5f5
- Location:
- arch/ia32
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/ia32/include/interrupt.h
r82da5f5 r567807b1 93 93 extern void (* eoi_function)(void); 94 94 95 extern void PRINT_INFO_ERRCODE(istate_t *istate); 95 96 extern void null_interrupt(int n, istate_t *istate); 96 97 extern void gp_fault(int n, istate_t *istate); … … 98 99 extern void ss_fault(int n, istate_t *istate); 99 100 extern void simd_fp_exception(int n, istate_t *istate); 100 extern void page_fault(int n, istate_t *istate);101 101 extern void syscall(int n, istate_t *istate); 102 102 extern void tlb_shootdown_ipi(int n, istate_t *istate); -
arch/ia32/include/mm/page.h
r82da5f5 r567807b1 91 91 #include <typedefs.h> 92 92 93 /* Page fault error codes. */ 94 95 /** When bit on this position is 0, the page fault was caused by a not-present page. */ 96 #define PFERR_CODE_P (1<<0) 97 98 /** When bit on this position is 1, the page fault was caused by a write. */ 99 #define PFERR_CODE_RW (1<<1) 100 101 /** When bit on this position is 1, the page fault was caused in user mode. */ 102 #define PFERR_CODE_US (1<<2) 103 104 /** When bit on this position is 1, a reserved bit was set in page directory. */ 105 #define PFERR_CODE_RSVD (1<<3) 106 93 107 /** Page Table Entry. */ 94 108 struct page_specifier { … … 139 153 140 154 extern void page_arch_init(void); 155 extern void page_fault(int n, istate_t *istate); 141 156 142 157 #endif /* __ASM__ */ -
arch/ia32/src/interrupt.c
r82da5f5 r567807b1 55 55 void (* eoi_function)(void) = NULL; 56 56 57 staticvoid PRINT_INFO_ERRCODE(istate_t *istate)57 void PRINT_INFO_ERRCODE(istate_t *istate) 58 58 { 59 59 char *symbol = get_symtab_entry(istate->eip); … … 140 140 } 141 141 142 void page_fault(int n, istate_t *istate)143 {144 __address page;145 146 page = read_cr2();147 if (as_page_fault(page, istate) == AS_PF_FAULT) {148 PRINT_INFO_ERRCODE(istate);149 printf("page fault address: %#x\n", page);150 panic("page fault\n");151 }152 }153 154 142 void syscall(int n, istate_t *istate) 155 143 { -
arch/ia32/src/mm/page.c
r82da5f5 r567807b1 44 44 #include <interrupt.h> 45 45 46 47 46 void page_arch_init(void) 48 47 { … … 88 87 return virtaddr; 89 88 } 89 90 void page_fault(int n, istate_t *istate) 91 { 92 __address page; 93 pf_access_t access; 94 95 page = read_cr2(); 96 97 if (istate->error_word & PFERR_CODE_RSVD) 98 panic("Reserved bit set in page directory.\n"); 99 100 if (istate->error_word & PFERR_CODE_RW) 101 access = PF_ACCESS_WRITE; 102 else 103 access = PF_ACCESS_READ; 104 105 if (as_page_fault(page, access, istate) == AS_PF_FAULT) { 106 PRINT_INFO_ERRCODE(istate); 107 printf("page fault address: %#x\n", page); 108 panic("page fault\n"); 109 } 110 }
Note:
See TracChangeset
for help on using the changeset viewer.