1 /*
2 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
3 */
4 /*
5 * Copyright 2011 Joyent, Inc. All rights reserved.
6 */
7
8 #ifndef _SYS_SEGMENTS_H
9 #define _SYS_SEGMENTS_H
10
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14
15 /*
16 * Copyright (c) 1989, 1990 William F. Jolitz
17 * Copyright (c) 1990 The Regents of the University of California.
18 * All rights reserved.
19 *
20 * This code is derived from software contributed to Berkeley by
21 * William Jolitz.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
505
506 /*
507 * Entries in the Global Descriptor Table (GDT)
508 *
509 * We make sure to space the system descriptors (LDT's, TSS')
510 * such that they are double gdt slot aligned. This is because
511 * in long mode system segment decriptors expand to 128 bits.
512 *
513 * GDT_LWPFS and GDT_LWPGS must be the same for both 32 and 64-bit
514 * kernels. See setup_context in libc. 64-bit processes must set
515 * %fs or %gs to null selector to use 64-bit fsbase or gsbase
516 * respectively.
517 */
518 #define GDT_NULL 0 /* null */
519 #define GDT_B32DATA 1 /* dboot 32 bit data descriptor */
520 #define GDT_B32CODE 2 /* dboot 32 bit code descriptor */
521 #define GDT_B16CODE 3 /* bios call 16 bit code descriptor */
522 #define GDT_B16DATA 4 /* bios call 16 bit data descriptor */
523 #define GDT_B64CODE 5 /* dboot 64 bit code descriptor */
524 #define GDT_BGSTMP 7 /* kmdb descriptor only used early in boot */
525
526 #if defined(__amd64)
527
528 #define GDT_KCODE 6 /* kernel code seg %cs */
529 #define GDT_KDATA 7 /* kernel data seg %ds */
530 #define GDT_U32CODE 8 /* 32-bit process on 64-bit kernel %cs */
531 #define GDT_UDATA 9 /* user data seg %ds (32 and 64 bit) */
532 #define GDT_UCODE 10 /* native user code seg %cs */
533 #define GDT_LDT 12 /* LDT for current process */
534 #define GDT_KTSS 14 /* kernel tss */
535 #define GDT_FS GDT_NULL /* kernel %fs segment selector */
536 #define GDT_GS GDT_NULL /* kernel %gs segment selector */
537 #define GDT_LWPFS 55 /* lwp private %fs segment selector (32-bit) */
538 #define GDT_LWPGS 56 /* lwp private %gs segment selector (32-bit) */
539 #define GDT_BRANDMIN 57 /* first entry in GDT for brand usage */
540 #define GDT_BRANDMAX 61 /* last entry in GDT for brand usage */
541 #define NGDT 62 /* number of entries in GDT */
542
543 /*
544 * This selector is only used in the temporary GDT used to bring additional
545 * CPUs from 16-bit real mode into long mode in real_mode_start().
546 */
547 #define TEMPGDT_KCODE64 1 /* 64-bit code selector */
548
549 #elif defined(__i386)
550
551 #define GDT_LDT 40 /* LDT for current process */
552 #define GDT_KTSS 42 /* kernel tss */
553 #define GDT_KCODE 43 /* kernel code seg %cs */
554 #define GDT_KDATA 44 /* kernel data seg %ds */
666 #endif /* __amd64 */
667
668 extern tss_t *ktss0;
669
670 #if defined(__i386)
671 extern tss_t *dftss0;
672 #endif /* __i386 */
673
674 extern void div0trap(), dbgtrap(), nmiint(), brktrap(), ovflotrap();
675 extern void boundstrap(), invoptrap(), ndptrap();
676 #if !defined(__xpv)
677 extern void syserrtrap();
678 #endif
679 extern void invaltrap(), invtsstrap(), segnptrap(), stktrap();
680 extern void gptrap(), pftrap(), ndperr();
681 extern void overrun(), resvtrap();
682 extern void _start(), cmnint();
683 extern void achktrap(), mcetrap();
684 extern void xmtrap();
685 extern void fasttrap();
686 extern void dtrace_ret();
687
688 #if !defined(__amd64)
689 extern void pentium_pftrap();
690 #endif
691
692 #endif /* _ASM */
693
694 #ifdef __cplusplus
695 }
696 #endif
697
698 #endif /* _SYS_SEGMENTS_H */
|
1 /*
2 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
3 */
4 /*
5 * Copyright 2016 Joyent, Inc.
6 */
7
8 #ifndef _SYS_SEGMENTS_H
9 #define _SYS_SEGMENTS_H
10
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14
15 /*
16 * Copyright (c) 1989, 1990 William F. Jolitz
17 * Copyright (c) 1990 The Regents of the University of California.
18 * All rights reserved.
19 *
20 * This code is derived from software contributed to Berkeley by
21 * William Jolitz.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
505
506 /*
507 * Entries in the Global Descriptor Table (GDT)
508 *
509 * We make sure to space the system descriptors (LDT's, TSS')
510 * such that they are double gdt slot aligned. This is because
511 * in long mode system segment decriptors expand to 128 bits.
512 *
513 * GDT_LWPFS and GDT_LWPGS must be the same for both 32 and 64-bit
514 * kernels. See setup_context in libc. 64-bit processes must set
515 * %fs or %gs to null selector to use 64-bit fsbase or gsbase
516 * respectively.
517 */
518 #define GDT_NULL 0 /* null */
519 #define GDT_B32DATA 1 /* dboot 32 bit data descriptor */
520 #define GDT_B32CODE 2 /* dboot 32 bit code descriptor */
521 #define GDT_B16CODE 3 /* bios call 16 bit code descriptor */
522 #define GDT_B16DATA 4 /* bios call 16 bit data descriptor */
523 #define GDT_B64CODE 5 /* dboot 64 bit code descriptor */
524 #define GDT_BGSTMP 7 /* kmdb descriptor only used early in boot */
525 #define GDT_CPUID 16 /* store numeric id of current CPU */
526
527 #if defined(__amd64)
528
529 #define GDT_KCODE 6 /* kernel code seg %cs */
530 #define GDT_KDATA 7 /* kernel data seg %ds */
531 #define GDT_U32CODE 8 /* 32-bit process on 64-bit kernel %cs */
532 #define GDT_UDATA 9 /* user data seg %ds (32 and 64 bit) */
533 #define GDT_UCODE 10 /* native user code seg %cs */
534 #define GDT_LDT 12 /* (12-13) LDT for current process */
535 #define GDT_KTSS 14 /* (14-15) kernel tss */
536 #define GDT_FS GDT_NULL /* kernel %fs segment selector */
537 #define GDT_GS GDT_NULL /* kernel %gs segment selector */
538 #define GDT_LWPFS 55 /* lwp private %fs segment selector (32-bit) */
539 #define GDT_LWPGS 56 /* lwp private %gs segment selector (32-bit) */
540 #define GDT_BRANDMIN 57 /* first entry in GDT for brand usage */
541 #define GDT_BRANDMAX 61 /* last entry in GDT for brand usage */
542 #define NGDT 62 /* number of entries in GDT */
543
544 /*
545 * This selector is only used in the temporary GDT used to bring additional
546 * CPUs from 16-bit real mode into long mode in real_mode_start().
547 */
548 #define TEMPGDT_KCODE64 1 /* 64-bit code selector */
549
550 #elif defined(__i386)
551
552 #define GDT_LDT 40 /* LDT for current process */
553 #define GDT_KTSS 42 /* kernel tss */
554 #define GDT_KCODE 43 /* kernel code seg %cs */
555 #define GDT_KDATA 44 /* kernel data seg %ds */
667 #endif /* __amd64 */
668
669 extern tss_t *ktss0;
670
671 #if defined(__i386)
672 extern tss_t *dftss0;
673 #endif /* __i386 */
674
675 extern void div0trap(), dbgtrap(), nmiint(), brktrap(), ovflotrap();
676 extern void boundstrap(), invoptrap(), ndptrap();
677 #if !defined(__xpv)
678 extern void syserrtrap();
679 #endif
680 extern void invaltrap(), invtsstrap(), segnptrap(), stktrap();
681 extern void gptrap(), pftrap(), ndperr();
682 extern void overrun(), resvtrap();
683 extern void _start(), cmnint();
684 extern void achktrap(), mcetrap();
685 extern void xmtrap();
686 extern void fasttrap();
687 extern void sys_int80();
688 extern void brand_sys_int80();
689 extern void dtrace_ret();
690
691 #if !defined(__amd64)
692 extern void pentium_pftrap();
693 #endif
694
695 #endif /* _ASM */
696
697 #ifdef __cplusplus
698 }
699 #endif
700
701 #endif /* _SYS_SEGMENTS_H */
|