Interrupt - Exception 14 (Segmentation Fault)

linkddlinkdd
Added on 2009-01-12 08:38:48
Interrupt - Exception 14 (Segmentation Fault) - Show - Edit - Download
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, &current->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);
        }
}