Path: blob/master/arch/x86/kernel/doublefault_32.c
10817 views
#include <linux/mm.h>1#include <linux/sched.h>2#include <linux/init.h>3#include <linux/init_task.h>4#include <linux/fs.h>56#include <asm/uaccess.h>7#include <asm/pgtable.h>8#include <asm/processor.h>9#include <asm/desc.h>1011#define DOUBLEFAULT_STACKSIZE (1024)12static unsigned long doublefault_stack[DOUBLEFAULT_STACKSIZE];13#define STACK_START (unsigned long)(doublefault_stack+DOUBLEFAULT_STACKSIZE)1415#define ptr_ok(x) ((x) > PAGE_OFFSET && (x) < PAGE_OFFSET + MAXMEM)1617static void doublefault_fn(void)18{19struct desc_ptr gdt_desc = {0, 0};20unsigned long gdt, tss;2122store_gdt(&gdt_desc);23gdt = gdt_desc.address;2425printk(KERN_EMERG "PANIC: double fault, gdt at %08lx [%d bytes]\n", gdt, gdt_desc.size);2627if (ptr_ok(gdt)) {28gdt += GDT_ENTRY_TSS << 3;29tss = get_desc_base((struct desc_struct *)gdt);30printk(KERN_EMERG "double fault, tss at %08lx\n", tss);3132if (ptr_ok(tss)) {33struct x86_hw_tss *t = (struct x86_hw_tss *)tss;3435printk(KERN_EMERG "eip = %08lx, esp = %08lx\n",36t->ip, t->sp);3738printk(KERN_EMERG "eax = %08lx, ebx = %08lx, ecx = %08lx, edx = %08lx\n",39t->ax, t->bx, t->cx, t->dx);40printk(KERN_EMERG "esi = %08lx, edi = %08lx\n",41t->si, t->di);42}43}4445for (;;)46cpu_relax();47}4849struct tss_struct doublefault_tss __cacheline_aligned = {50.x86_tss = {51.sp0 = STACK_START,52.ss0 = __KERNEL_DS,53.ldt = 0,54.io_bitmap_base = INVALID_IO_BITMAP_OFFSET,5556.ip = (unsigned long) doublefault_fn,57/* 0x2 bit is always set */58.flags = X86_EFLAGS_SF | 0x2,59.sp = STACK_START,60.es = __USER_DS,61.cs = __KERNEL_CS,62.ss = __KERNEL_DS,63.ds = __USER_DS,64.fs = __KERNEL_PERCPU,6566.__cr3 = __pa_nodebug(swapper_pg_dir),67}68};697071