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 #if defined(__lint)
  29 #pragma pack(1)
  30 struct {
  31         uint16_t limit_low;
  32         uint16_t base_low;
  33         uint8_t base_middle;
  34         uint8_t attr;
  35         uint8_t attr_and_limit;
  36         uint8_t base_high;
  37 } global_descriptor_table[8];
  38 struct {
  39         uint16_t limit; /* sizeof (global_descriptor_table) - 1 */
  40         void     *base; /* &global_descriptor_table */
  41 } gdt_info;
  42 #pragma pack()
  43 
  44 #else   /* __lint */
  45 
  46         .align 16
  47         .data
  48         /*
  49          * This must remain in sync with the entries in intel/sys/gdt.h; in
  50          * particular kmdb uses B64CODE_SEL or B32CODE_SEL in perpetuity for
  51          * its IDT entries (they're copied to the kernel's GDT in init_idt()).
  52          */
  53 
  54 global_descriptor_table:
  55         .long   0
  56         .long   0
  57 
  58         /* GDT_B32DATA: 32 bit flat data descriptor */
  59         .value  0xFFFF  /* segment limit 0..15 */
  60         .value  0x0000  /* segment base 0..15 */
  61         .byte   0x0     /* segment base 16..23 */
  62         .byte   0x92    /* P = 1, read/write data */
  63         .byte   0xCF    /* G=1, B=1, Limit (16..19)=1111 */
  64         .byte   0x0     /* segment base 24..32 */
  65 
  66         /* GDT_B32CODE 32 bit flat code descriptor */
  67         .value  0xFFFF  /* segment limit 0..15 */
  68         .value  0x0000  /* segment base 0..15 */
  69         .byte   0x0     /* segment base 16..23 */
  70         .byte   0x9A    /* P=1, code, exec, readable */
  71         .byte   0xCF    /* G=1, D=1, Limit (16..19)=1111 */
  72         .byte   0x0     /* segment base 24..32 */
  73 
  74         /*
  75          * GDT_B16CODE 16 bit code descriptor for doing BIOS calls
  76          */
  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   0x0F    /* G=0, D=0, Limit (16..19)=1111 */
  82         .byte   0x0     /* segment base 24..32 */
  83 
  84         /*
  85          * GDT_B16DATA 16 bit data descriptor for doing BIOS calls
  86          */
  87         .value  0xFFFF  /* segment limit 0..15 */
  88         .value  0x0000  /* segment base 0..15 */
  89         .byte   0x0     /* segment base 16..23 */
  90         .byte   0x92    /* P = 1, read/write data */
  91         .byte   0x4F    /* G=0, D=1, Limit (16..19)=1111 */
  92         .byte   0x0     /* segment base 24..32 */
  93 
  94         /* GDT_B64CODE: 64 bit flat code descriptor - only L bit has meaning */
  95         .value  0xFFFF  /* segment limit 0..15 */
  96         .value  0x0000  /* segment base 0..15 */
  97         .byte   0x0     /* segment base 16..23 */
  98         .byte   0x9A    /* P=1, code, exec, readable */
  99         .byte   0xAF    /* G=1, D=0, L=1, Limit (16..19)=1111 */
 100         .byte   0x0     /* segment base 24..32 */
 101 
 102         /*
 103          * unused
 104          */
 105         .long   0
 106         .long   0
 107 
 108         /*
 109          * GDT_BGSTMP -- an entry for kmdb to use during boot
 110          * the fast reboot code uses this entry for memory copies, too.
 111          */
 112         .value  0x0001  /* segment limit 0..15 */
 113 
 114         .globl fake_cpu_gdt_base_0_15
 115 fake_cpu_gdt_base_0_15:
 116 
 117         .value  0x0000  /* segment base 0..15 */
 118 
 119         .globl fake_cpu_gdt_base_16_23
 120 fake_cpu_gdt_base_16_23:
 121         .byte   0x0     /* segment base 16..23 */
 122         .byte   0x9A    /* P=1, code, exec, readable */
 123         .byte   0xC0    /* G=1, D=1, Limit (16..19)=0000 */
 124 
 125         .globl fake_cpu_gdt_base_24_31
 126 fake_cpu_gdt_base_24_31:
 127         .byte   0x0     /* segment base 24..32 */
 128 
 129 /       .long   0
 130 /       .long   0
 131 
 132 gdt_info:
 133         .value  gdt_info - global_descriptor_table - 1
 134         .long   global_descriptor_table
 135         .long   0               /* needed for 64 bit */
 136 
 137 fake_cpu:
 138         .4byte 0
 139         .4byte 0
 140         .4byte 0
 141         .globl fake_cpu_ptr
 142 fake_cpu_ptr:
 143         .4byte 0
 144         .skip 0x6c0, 0
 145 
 146 #endif  /* __lint */