1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 
  28         .align 16
  29         .data
  30         /*
  31          * This must remain in sync with the entries in intel/sys/gdt.h; in
  32          * particular kmdb uses B64CODE_SEL or B32CODE_SEL in perpetuity for
  33          * its IDT entries (they're copied to the kernel's GDT in init_idt()).
  34          */
  35 
  36 global_descriptor_table:
  37         .long   0
  38         .long   0
  39 
  40         /* GDT_B32DATA: 32 bit flat data descriptor */
  41         .value  0xFFFF  /* segment limit 0..15 */
  42         .value  0x0000  /* segment base 0..15 */
  43         .byte   0x0     /* segment base 16..23 */
  44         .byte   0x92    /* P = 1, read/write data */
  45         .byte   0xCF    /* G=1, B=1, Limit (16..19)=1111 */
  46         .byte   0x0     /* segment base 24..32 */
  47 
  48         /* GDT_B32CODE 32 bit flat code descriptor */
  49         .value  0xFFFF  /* segment limit 0..15 */
  50         .value  0x0000  /* segment base 0..15 */
  51         .byte   0x0     /* segment base 16..23 */
  52         .byte   0x9A    /* P=1, code, exec, readable */
  53         .byte   0xCF    /* G=1, D=1, Limit (16..19)=1111 */
  54         .byte   0x0     /* segment base 24..32 */
  55 
  56         /*
  57          * GDT_B16CODE 16 bit code descriptor for doing BIOS calls
  58          */
  59         .value  0xFFFF  /* segment limit 0..15 */
  60         .value  0x0000  /* segment base 0..15 */
  61         .byte   0x0     /* segment base 16..23 */
  62         .byte   0x9A    /* P=1, code, exec, readable */
  63         .byte   0x0F    /* G=0, D=0, Limit (16..19)=1111 */
  64         .byte   0x0     /* segment base 24..32 */
  65 
  66         /*
  67          * GDT_B16DATA 16 bit data descriptor for doing BIOS calls
  68          */
  69         .value  0xFFFF  /* segment limit 0..15 */
  70         .value  0x0000  /* segment base 0..15 */
  71         .byte   0x0     /* segment base 16..23 */
  72         .byte   0x92    /* P = 1, read/write data */
  73         .byte   0x4F    /* G=0, D=1, Limit (16..19)=1111 */
  74         .byte   0x0     /* segment base 24..32 */
  75 
  76         /* GDT_B64CODE: 64 bit flat code descriptor - only L bit has meaning */
  77         .value  0xFFFF  /* segment limit 0..15 */
  78         .value  0x0000  /* segment base 0..15 */
  79         .byte   0x0     /* segment base 16..23 */
  80         .byte   0x9A    /* P=1, code, exec, readable */
  81         .byte   0xAF    /* G=1, D=0, L=1, Limit (16..19)=1111 */
  82         .byte   0x0     /* segment base 24..32 */
  83 
  84         /*
  85          * unused
  86          */
  87         .long   0
  88         .long   0
  89 
  90         /*
  91          * GDT_BGSTMP -- an entry for kmdb to use during boot
  92          * the fast reboot code uses this entry for memory copies, too.
  93          */
  94         .value  0x0001  /* segment limit 0..15 */
  95 
  96         .globl fake_cpu_gdt_base_0_15
  97 fake_cpu_gdt_base_0_15:
  98 
  99         .value  0x0000  /* segment base 0..15 */
 100 
 101         .globl fake_cpu_gdt_base_16_23
 102 fake_cpu_gdt_base_16_23:
 103         .byte   0x0     /* segment base 16..23 */
 104         .byte   0x9A    /* P=1, code, exec, readable */
 105         .byte   0xC0    /* G=1, D=1, Limit (16..19)=0000 */
 106 
 107         .globl fake_cpu_gdt_base_24_31
 108 fake_cpu_gdt_base_24_31:
 109         .byte   0x0     /* segment base 24..32 */
 110 
 111 /       .long   0
 112 /       .long   0
 113 
 114 gdt_info:
 115         .value  gdt_info - global_descriptor_table - 1
 116         .long   global_descriptor_table
 117         .long   0               /* needed for 64 bit */
 118 
 119 fake_cpu:
 120         .4byte 0
 121         .4byte 0
 122         .4byte 0
 123         .globl fake_cpu_ptr
 124 fake_cpu_ptr:
 125         .4byte 0
 126         .skip 0x6c0, 0
 127