void _except14(void)
{
uint32 faulting_addr;
uint32 eip, code;
struct page *pg;
asm(" movl 60(%%ebp), %%eax; \
mov %%eax, %0; \
mov %%cr2, %%eax; \
mov %%eax, %1": "=m"(eip), "=m"(faulting_addr): );
if (faulting_addr > USER_OFFSET && faulting_addr < USER_STACK)
{
pg = (struct page *) kmalloc (sizeof (struct page));
pg->p_addr = get_page_frame ();
pg->v_addr = (char *) (faulting_addr & 0xFFFFF000);
list_add (&pg->list, ¤t->pglist);
pd_add_page (pg->v_addr, pg->p_addr, PG_USER, current->pd);
}
else
{
kattr = 0x04;
printk ("# Segmentation Fault :\n");
printk("\t- EIP: %p\n", eip);
printk("\t- CR2: %p\n", faulting_addr);
printk("\t- Code: %p\n", code);
kattr = 0x0F;
sys_exit (1);
}
}