VirtualBox

Changeset 84652 in vbox


Ignore:
Timestamp:
Jun 3, 2020 9:08:30 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
138404
Message:

APIC: Move generic defs from VBox/vmm/apic.h and APICInternal.h to VBox/apic.h.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/apic.h

    r82968 r84652  
    3333
    3434#include <iprt/types.h>
    35 
     35#include <iprt/x86.h>
     36
     37/** @todo These are defines used by CPUM and perhaps some assembly code. Remove
     38 *        these and use the XAPIC counterpart defines below later. */
    3639#define APIC_REG_VERSION                        0x0030
    3740#define APIC_REG_VERSION_GET_VER(u32)           (u32 & 0xff)
     
    5861#define APIC_REG_LVT_MASKED                     RT_BIT(16)
    5962
     63/** The APIC hardware version number for Pentium 4. */
     64#define XAPIC_HARDWARE_VERSION_P4            UINT8_C(0x14)
     65/** Maximum number of LVT entries for Pentium 4. */
     66#define XAPIC_MAX_LVT_ENTRIES_P4             UINT8_C(6)
     67/** Size of the APIC ID bits for Pentium 4. */
     68#define XAPIC_APIC_ID_BIT_COUNT_P4           UINT8_C(8)
     69
     70/** The APIC hardware version number for Pentium 6. */
     71#define XAPIC_HARDWARE_VERSION_P6            UINT8_C(0x10)
     72/** Maximum number of LVT entries for Pentium 6. */
     73#define XAPIC_MAX_LVT_ENTRIES_P6             UINT8_C(4)
     74/** Size of the APIC ID bits for Pentium 6. */
     75#define XAPIC_APIC_ID_BIT_COUNT_P6           UINT8_C(4)
     76
     77/** Illegal APIC vector value start. */
     78#define XAPIC_ILLEGAL_VECTOR_START           UINT8_C(0)
     79/** Illegal APIC vector value end (inclusive). */
     80#define XAPIC_ILLEGAL_VECTOR_END             UINT8_C(15)
     81/** Reserved APIC vector value start. */
     82#define XAPIC_RSVD_VECTOR_START              UINT8_C(16)
     83/** Reserved APIC vector value end (inclusive). */
     84#define XAPIC_RSVD_VECTOR_END                UINT8_C(31)
     85
     86/** ESR - Send checksum error for Pentium 6. */
     87# define XAPIC_ESR_SEND_CHKSUM_ERROR_P6      RT_BIT(0)
     88/** ESR - Send accept error for Pentium 6. */
     89# define XAPIC_ESR_RECV_CHKSUM_ERROR_P6      RT_BIT(1)
     90/** ESR - Send accept error for Pentium 6. */
     91# define XAPIC_ESR_SEND_ACCEPT_ERROR_P6      RT_BIT(2)
     92/** ESR - Receive accept error for Pentium 6. */
     93# define XAPIC_ESR_RECV_ACCEPT_ERROR_P6      RT_BIT(3)
     94
     95/** ESR - Redirectable IPI. */
     96#define XAPIC_ESR_REDIRECTABLE_IPI           RT_BIT(4)
     97/** ESR - Send accept error. */
     98#define XAPIC_ESR_SEND_ILLEGAL_VECTOR        RT_BIT(5)
     99/** ESR - Send accept error. */
     100#define XAPIC_ESR_RECV_ILLEGAL_VECTOR        RT_BIT(6)
     101/** ESR - Send accept error. */
     102#define XAPIC_ESR_ILLEGAL_REG_ADDRESS        RT_BIT(7)
     103/** ESR - Valid write-only bits. */
     104#define XAPIC_ESR_WO_VALID                   UINT32_C(0x0)
     105
     106/** TPR - Valid bits. */
     107#define XAPIC_TPR_VALID                      UINT32_C(0xff)
     108/** TPR - Task-priority class. */
     109#define XAPIC_TPR_TP                         UINT32_C(0xf0)
     110/** TPR - Task-priority subclass. */
     111#define XAPIC_TPR_TP_SUBCLASS                UINT32_C(0x0f)
     112/** TPR - Gets the task-priority class. */
     113#define XAPIC_TPR_GET_TP(a_Tpr)              ((a_Tpr) & XAPIC_TPR_TP)
     114/** TPR - Gets the task-priority subclass. */
     115#define XAPIC_TPR_GET_TP_SUBCLASS(a_Tpr)     ((a_Tpr) & XAPIC_TPR_TP_SUBCLASS)
     116
     117/** PPR - Valid bits. */
     118#define XAPIC_PPR_VALID                      UINT32_C(0xff)
     119/** PPR - Processor-priority class. */
     120#define XAPIC_PPR_PP                         UINT32_C(0xf0)
     121/** PPR - Processor-priority subclass. */
     122#define XAPIC_PPR_PP_SUBCLASS                UINT32_C(0x0f)
     123/** PPR - Get the processor-priority class. */
     124#define XAPIC_PPR_GET_PP(a_Ppr)              ((a_Ppr) & XAPIC_PPR_PP)
     125/** PPR - Get the processor-priority subclass. */
     126#define XAPIC_PPR_GET_PP_SUBCLASS(a_Ppr)     ((a_Ppr) & XAPIC_PPR_PP_SUBCLASS)
     127
     128/** Timer mode - One-shot. */
     129#define XAPIC_TIMER_MODE_ONESHOT             UINT32_C(0)
     130/** Timer mode - Periodic. */
     131#define XAPIC_TIMER_MODE_PERIODIC            UINT32_C(1)
     132/** Timer mode - TSC deadline. */
     133#define XAPIC_TIMER_MODE_TSC_DEADLINE        UINT32_C(2)
     134
     135/** LVT - The vector. */
     136#define XAPIC_LVT_VECTOR                     UINT32_C(0xff)
     137/** LVT - Gets the vector from an LVT entry. */
     138#define XAPIC_LVT_GET_VECTOR(a_Lvt)          ((a_Lvt) & XAPIC_LVT_VECTOR)
     139/** LVT - The mask. */
     140#define XAPIC_LVT_MASK                       RT_BIT(16)
     141/** LVT - Is the LVT masked? */
     142#define XAPIC_LVT_IS_MASKED(a_Lvt)           RT_BOOL((a_Lvt) & XAPIC_LVT_MASK)
     143/** LVT - Timer mode. */
     144#define XAPIC_LVT_TIMER_MODE                 RT_BIT(17)
     145/** LVT - Timer TSC-deadline timer mode. */
     146#define XAPIC_LVT_TIMER_TSCDEADLINE          RT_BIT(18)
     147/** LVT - Gets the timer mode. */
     148#define XAPIC_LVT_GET_TIMER_MODE(a_Lvt)      (XAPICTIMERMODE)(((a_Lvt) >> 17) & UINT32_C(3))
     149/** LVT - Delivery mode. */
     150#define XAPIC_LVT_DELIVERY_MODE              (RT_BIT(8) | RT_BIT(9) | RT_BIT(10))
     151/** LVT - Gets the delivery mode. */
     152#define XAPIC_LVT_GET_DELIVERY_MODE(a_Lvt)   (XAPICDELIVERYMODE)(((a_Lvt) >> 8) & UINT32_C(7))
     153/** LVT - Delivery status. */
     154#define XAPIC_LVT_DELIVERY_STATUS            RT_BIT(12)
     155/** LVT - Trigger mode. */
     156#define XAPIC_LVT_TRIGGER_MODE               RT_BIT(15)
     157/** LVT - Gets the trigger mode. */
     158#define XAPIC_LVT_GET_TRIGGER_MODE(a_Lvt)    (XAPICTRIGGERMODE)(((a_Lvt) >> 15) & UINT32_C(1))
     159/** LVT - Remote IRR. */
     160#define XAPIC_LVT_REMOTE_IRR                 RT_BIT(14)
     161/** LVT - Gets the Remote IRR. */
     162#define XAPIC_LVT_GET_REMOTE_IRR(a_Lvt)      (((a_Lvt) >> 14) & 1)
     163/** LVT - Interrupt Input Pin Polarity. */
     164#define XAPIC_LVT_POLARITY                   RT_BIT(13)
     165/** LVT - Gets the Interrupt Input Pin Polarity. */
     166#define XAPIC_LVT_GET_POLARITY(a_Lvt)        (((a_Lvt) >> 13) & 1)
     167/** LVT - Valid bits common to all LVTs. */
     168#define XAPIC_LVT_COMMON_VALID               (XAPIC_LVT_VECTOR | XAPIC_LVT_DELIVERY_STATUS | XAPIC_LVT_MASK)
     169/** LVT CMCI - Valid bits. */
     170#define XAPIC_LVT_CMCI_VALID                 (XAPIC_LVT_COMMON_VALID | XAPIC_LVT_DELIVERY_MODE)
     171/** LVT Timer - Valid bits. */
     172#define XAPIC_LVT_TIMER_VALID                (XAPIC_LVT_COMMON_VALID | XAPIC_LVT_TIMER_MODE | XAPIC_LVT_TIMER_TSCDEADLINE)
     173/** LVT Thermal - Valid bits. */
     174#define XAPIC_LVT_THERMAL_VALID              (XAPIC_LVT_COMMON_VALID | XAPIC_LVT_DELIVERY_MODE)
     175/** LVT Perf - Valid bits. */
     176#define XAPIC_LVT_PERF_VALID                 (XAPIC_LVT_COMMON_VALID | XAPIC_LVT_DELIVERY_MODE)
     177/** LVT LINTx - Valid bits. */
     178#define XAPIC_LVT_LINT_VALID                 (  XAPIC_LVT_COMMON_VALID | XAPIC_LVT_DELIVERY_MODE | XAPIC_LVT_DELIVERY_STATUS \
     179                                              | XAPIC_LVT_POLARITY | XAPIC_LVT_REMOTE_IRR | XAPIC_LVT_TRIGGER_MODE)
     180/** LVT Error - Valid bits. */
     181#define XAPIC_LVT_ERROR_VALID                (XAPIC_LVT_COMMON_VALID)
     182
     183/** SVR - The vector. */
     184#define XAPIC_SVR_VECTOR                     UINT32_C(0xff)
     185/** SVR - APIC Software enable. */
     186#define XAPIC_SVR_SOFTWARE_ENABLE            RT_BIT(8)
     187/** SVR - Supress EOI broadcast. */
     188#define XAPIC_SVR_SUPRESS_EOI_BROADCAST      RT_BIT(12)
     189/** SVR - Valid bits for Pentium 4. */
     190# define XAPIC_SVR_VALID_P4                  (XAPIC_SVR_VECTOR | XAPIC_SVR_SOFTWARE_ENABLE)
     191/** @todo SVR - Valid bits for Pentium 6. */
     192
     193/** DFR - Valid bits. */
     194#define XAPIC_DFR_VALID                      UINT32_C(0xf0000000)
     195/** DFR - Reserved bits that must always remain set. */
     196#define XAPIC_DFR_RSVD_MB1                   UINT32_C(0x0fffffff)
     197/** DFR - The model. */
     198#define XAPIC_DFR_MODEL                      UINT32_C(0xf)
     199/** DFR - Gets the destination model. */
     200#define XAPIC_DFR_GET_MODEL(a_uReg)          (((a_uReg) >> 28) & XAPIC_DFR_MODEL)
     201
     202/** LDR - Valid bits. */
     203#define XAPIC_LDR_VALID                      UINT32_C(0xff000000)
     204/** LDR - Cluster ID mask (x2APIC). */
     205#define X2APIC_LDR_CLUSTER_ID                UINT32_C(0xffff0000)
     206/** LDR - Mask of the LDR cluster ID (x2APIC). */
     207#define X2APIC_LDR_GET_CLUSTER_ID(a_uReg)    ((a_uReg) & X2APIC_LDR_CLUSTER_ID)
     208/** LDR - Mask of the LDR logical ID (x2APIC). */
     209#define X2APIC_LDR_LOGICAL_ID                UINT32_C(0x0000ffff)
     210
     211/** LDR - Flat mode logical ID mask. */
     212#define XAPIC_LDR_FLAT_LOGICAL_ID            UINT32_C(0xff)
     213/** LDR - Clustered mode cluster ID mask. */
     214#define XAPIC_LDR_CLUSTERED_CLUSTER_ID       UINT32_C(0xf0)
     215/** LDR - Clustered mode logical ID mask. */
     216#define XAPIC_LDR_CLUSTERED_LOGICAL_ID       UINT32_C(0x0f)
     217/** LDR - Gets the clustered mode cluster ID. */
     218#define XAPIC_LDR_CLUSTERED_GET_CLUSTER_ID(a_uReg)   ((a_uReg) & XAPIC_LDR_CLUSTERED_CLUSTER_ID)
     219
     220
     221/** EOI - Valid write-only bits. */
     222#define XAPIC_EOI_WO_VALID                   UINT32_C(0x0)
     223/** Timer ICR - Valid bits. */
     224#define XAPIC_TIMER_ICR_VALID                UINT32_C(0xffffffff)
     225/** Timer DCR - Valid bits. */
     226#define XAPIC_TIMER_DCR_VALID                (RT_BIT(0) | RT_BIT(1) | RT_BIT(3))
     227
     228/** Self IPI - Valid bits. */
     229#define XAPIC_SELF_IPI_VALID                 UINT32_C(0xff)
     230/** Self IPI - The vector. */
     231#define XAPIC_SELF_IPI_VECTOR                UINT32_C(0xff)
     232/** Self IPI - Gets the vector. */
     233#define XAPIC_SELF_IPI_GET_VECTOR(a_uReg)    ((a_uReg) & XAPIC_SELF_IPI_VECTOR)
     234
     235/** ICR Low - The Vector. */
     236#define XAPIC_ICR_LO_VECTOR                  UINT32_C(0xff)
     237/** ICR Low - Gets the vector. */
     238#define XAPIC_ICR_LO_GET_VECTOR(a_uIcr)      ((a_uIcr) & XAPIC_ICR_LO_VECTOR)
     239/** ICR Low - The delivery mode. */
     240#define XAPIC_ICR_LO_DELIVERY_MODE           (RT_BIT(8) | RT_BIT(9) | RT_BIT(10))
     241/** ICR Low - The destination mode. */
     242#define XAPIC_ICR_LO_DEST_MODE               RT_BIT(11)
     243/** ICR Low - The delivery status. */
     244#define XAPIC_ICR_LO_DELIVERY_STATUS         RT_BIT(12)
     245/** ICR Low - The level. */
     246#define XAPIC_ICR_LO_LEVEL                   RT_BIT(14)
     247/** ICR Low - The trigger mode. */
     248#define XAPIC_ICR_TRIGGER_MODE               RT_BIT(15)
     249/** ICR Low - The destination shorthand. */
     250#define XAPIC_ICR_LO_DEST_SHORTHAND          (RT_BIT(18) | RT_BIT(19))
     251/** ICR Low - Valid write bits. */
     252#define XAPIC_ICR_LO_WR_VALID                (  XAPIC_ICR_LO_VECTOR | XAPIC_ICR_LO_DELIVERY_MODE | XAPIC_ICR_LO_DEST_MODE \
     253                                              | XAPIC_ICR_LO_LEVEL | XAPIC_ICR_TRIGGER_MODE | XAPIC_ICR_LO_DEST_SHORTHAND)
     254
     255/** ICR High - The destination field. */
     256#define XAPIC_ICR_HI_DEST                    UINT32_C(0xff000000)
     257/** ICR High - Get the destination field. */
     258#define XAPIC_ICR_HI_GET_DEST(a_u32IcrHi)    (((a_u32IcrHi) >> 24) & XAPIC_ICR_HI_DEST)
     259/** ICR High - Valid write bits in xAPIC mode. */
     260#define XAPIC_ICR_HI_WR_VALID                XAPIC_ICR_HI_DEST
     261
     262/** APIC ID broadcast mask - x2APIC mode. */
     263#define X2APIC_ID_BROADCAST_MASK             UINT32_C(0xffffffff)
     264/** APIC ID broadcast mask - xAPIC mode for Pentium 4. */
     265# define XAPIC_ID_BROADCAST_MASK_P4          UINT32_C(0xff)
     266/** @todo Broadcast mask for Pentium 6. */
     267
     268/** Get an xAPIC page offset for an x2APIC MSR value. */
     269#define X2APIC_GET_XAPIC_OFF(a_uMsr)         ((((a_uMsr) - MSR_IA32_X2APIC_START) << 4) & UINT32_C(0xff0))
     270/** Get an x2APIC MSR for an xAPIC page offset. */
     271#define XAPIC_GET_X2APIC_MSR(a_offReg)       ((((a_offReg) & UINT32_C(0xff0)) >> 4) | MSR_IA32_X2APIC_START)
     272
     273/** @name xAPIC and x2APIC register offsets.
     274 * See Intel spec. 10.4.1 "The Local APIC Block Diagram".
     275 * @{ */
     276/** Offset of APIC ID Register. */
     277#define XAPIC_OFF_ID                         0x020
     278/** Offset of APIC Version Register. */
     279#define XAPIC_OFF_VERSION                    0x030
     280/** Offset of Task Priority Register. */
     281#define XAPIC_OFF_TPR                        0x080
     282/** Offset of Arbitrartion Priority register. */
     283#define XAPIC_OFF_APR                        0x090
     284/** Offset of Processor Priority register. */
     285#define XAPIC_OFF_PPR                        0x0A0
     286/** Offset of End Of Interrupt register. */
     287#define XAPIC_OFF_EOI                        0x0B0
     288/** Offset of Remote Read Register. */
     289#define XAPIC_OFF_RRD                        0x0C0
     290/** Offset of Logical Destination Register. */
     291#define XAPIC_OFF_LDR                        0x0D0
     292/** Offset of Destination Format Register. */
     293#define XAPIC_OFF_DFR                        0x0E0
     294/** Offset of Spurious Interrupt Vector Register. */
     295#define XAPIC_OFF_SVR                        0x0F0
     296/** Offset of In-service Register (bits 31:0). */
     297#define XAPIC_OFF_ISR0                       0x100
     298/** Offset of In-service Register (bits 63:32). */
     299#define XAPIC_OFF_ISR1                       0x110
     300/** Offset of In-service Register (bits 95:64). */
     301#define XAPIC_OFF_ISR2                       0x120
     302/** Offset of In-service Register (bits 127:96). */
     303#define XAPIC_OFF_ISR3                       0x130
     304/** Offset of In-service Register (bits 159:128). */
     305#define XAPIC_OFF_ISR4                       0x140
     306/** Offset of In-service Register (bits 191:160). */
     307#define XAPIC_OFF_ISR5                       0x150
     308/** Offset of In-service Register (bits 223:192). */
     309#define XAPIC_OFF_ISR6                       0x160
     310/** Offset of In-service Register (bits 255:224). */
     311#define XAPIC_OFF_ISR7                       0x170
     312/** Offset of Trigger Mode Register (bits 31:0). */
     313#define XAPIC_OFF_TMR0                       0x180
     314/** Offset of Trigger Mode Register (bits 63:32). */
     315#define XAPIC_OFF_TMR1                       0x190
     316/** Offset of Trigger Mode Register (bits 95:64). */
     317#define XAPIC_OFF_TMR2                       0x1A0
     318/** Offset of Trigger Mode Register (bits 127:96). */
     319#define XAPIC_OFF_TMR3                       0x1B0
     320/** Offset of Trigger Mode Register (bits 159:128). */
     321#define XAPIC_OFF_TMR4                       0x1C0
     322/** Offset of Trigger Mode Register (bits 191:160). */
     323#define XAPIC_OFF_TMR5                       0x1D0
     324/** Offset of Trigger Mode Register (bits 223:192). */
     325#define XAPIC_OFF_TMR6                       0x1E0
     326/** Offset of Trigger Mode Register (bits 255:224). */
     327#define XAPIC_OFF_TMR7                       0x1F0
     328/** Offset of Interrupt Request Register (bits 31:0). */
     329#define XAPIC_OFF_IRR0                       0x200
     330/** Offset of Interrupt Request Register (bits 63:32). */
     331#define XAPIC_OFF_IRR1                       0x210
     332/** Offset of Interrupt Request Register (bits 95:64). */
     333#define XAPIC_OFF_IRR2                       0x220
     334/** Offset of Interrupt Request Register (bits 127:96). */
     335#define XAPIC_OFF_IRR3                       0x230
     336/** Offset of Interrupt Request Register (bits 159:128). */
     337#define XAPIC_OFF_IRR4                       0x240
     338/** Offset of Interrupt Request Register (bits 191:160). */
     339#define XAPIC_OFF_IRR5                       0x250
     340/** Offset of Interrupt Request Register (bits 223:192). */
     341#define XAPIC_OFF_IRR6                       0x260
     342/** Offset of Interrupt Request Register (bits 255:224). */
     343#define XAPIC_OFF_IRR7                       0x270
     344/** Offset of Error Status Register. */
     345#define XAPIC_OFF_ESR                        0x280
     346/** Offset of LVT CMCI Register. */
     347#define XAPIC_OFF_LVT_CMCI                   0x2F0
     348/** Offset of Interrupt Command Register - Lo. */
     349#define XAPIC_OFF_ICR_LO                     0x300
     350/** Offset of Interrupt Command Register - Hi. */
     351#define XAPIC_OFF_ICR_HI                     0x310
     352/** Offset of LVT Timer Register. */
     353#define XAPIC_OFF_LVT_TIMER                  0x320
     354/** Offset of LVT Thermal Sensor Register. */
     355#define XAPIC_OFF_LVT_THERMAL                0x330
     356/** Offset of LVT Performance Counter Register. */
     357#define XAPIC_OFF_LVT_PERF                   0x340
     358/** Offset of LVT LINT0 Register. */
     359#define XAPIC_OFF_LVT_LINT0                  0x350
     360/** Offset of LVT LINT1 Register. */
     361#define XAPIC_OFF_LVT_LINT1                  0x360
     362/** Offset of LVT Error Register . */
     363#define XAPIC_OFF_LVT_ERROR                  0x370
     364/** Offset of Timer Initial Count Register. */
     365#define XAPIC_OFF_TIMER_ICR                  0x380
     366/** Offset of Timer Current Count Register. */
     367#define XAPIC_OFF_TIMER_CCR                  0x390
     368/** Offset of Timer Divide Configuration Register. */
     369#define XAPIC_OFF_TIMER_DCR                  0x3E0
     370/** Offset of Self-IPI Register (x2APIC only). */
     371#define X2APIC_OFF_SELF_IPI                  0x3F0
     372
     373/** Offset of LVT range start. */
     374#define XAPIC_OFF_LVT_START                  XAPIC_OFF_LVT_TIMER
     375/** Offset of LVT range end (inclusive).  */
     376#define XAPIC_OFF_LVT_END                    XAPIC_OFF_LVT_ERROR
     377/** Offset of LVT extended range start. */
     378#define XAPIC_OFF_LVT_EXT_START              XAPIC_OFF_LVT_CMCI
     379/** Offset of LVT extended range end (inclusive). */
     380#define XAPIC_OFF_LVT_EXT_END                XAPIC_OFF_LVT_CMCI
     381/** Offset of the last register (incl. reserved) in the xAPIC/x2APIC range. */
     382#define XAPIC_OFF_END                        0x3F0
     383/** @} */
     384
     385/** @name xAPIC Destination Format Register bits.
     386 * See Intel spec. 10.6.2.2 "Logical Destination Mode".
     387 * @{ */
     388typedef enum XAPICDESTFORMAT
     389{
     390    XAPICDESTFORMAT_FLAT    = 0xf,
     391    XAPICDESTFORMAT_CLUSTER = 0
     392} XAPICDESTFORMAT;
     393/** @} */
     394
     395/** @name xAPIC Timer Mode bits.
     396 * See Intel spec. 10.5.1 "Local Vector Table".
     397 * @{ */
     398typedef enum XAPICTIMERMODE
     399{
     400    XAPICTIMERMODE_ONESHOT      = XAPIC_TIMER_MODE_ONESHOT,
     401    XAPICTIMERMODE_PERIODIC     = XAPIC_TIMER_MODE_PERIODIC,
     402    XAPICTIMERMODE_TSC_DEADLINE = XAPIC_TIMER_MODE_TSC_DEADLINE
     403} XAPICTIMERMODE;
     404/** @} */
     405
     406/** @name xAPIC Interrupt Command Register bits.
     407 * See Intel spec. 10.6.1 "Interrupt Command Register (ICR)".
     408 * See Intel spec. 10.5.1 "Local Vector Table".
     409 * @{ */
     410/**
     411 * xAPIC destination shorthand.
     412 */
     413typedef enum XAPICDESTSHORTHAND
     414{
     415    XAPICDESTSHORTHAND_NONE = 0,
     416    XAPICDESTSHORTHAND_SELF,
     417    XAPIDDESTSHORTHAND_ALL_INCL_SELF,
     418    XAPICDESTSHORTHAND_ALL_EXCL_SELF
     419} XAPICDESTSHORTHAND;
     420
     421/**
     422 * xAPIC INIT level de-assert delivery mode.
     423 */
     424typedef enum XAPICINITLEVEL
     425{
     426    XAPICINITLEVEL_DEASSERT = 0,
     427    XAPICINITLEVEL_ASSERT
     428} XAPICLEVEL;
     429
     430/**
     431 * xAPIC destination mode.
     432 */
     433typedef enum XAPICDESTMODE
     434{
     435    XAPICDESTMODE_PHYSICAL = 0,
     436    XAPICDESTMODE_LOGICAL
     437} XAPICDESTMODE;
     438
     439/**
     440 * xAPIC delivery mode type.
     441 */
     442typedef enum XAPICDELIVERYMODE
     443{
     444    XAPICDELIVERYMODE_FIXED               = 0,
     445    XAPICDELIVERYMODE_LOWEST_PRIO         = 1,
     446    XAPICDELIVERYMODE_SMI                 = 2,
     447    XAPICDELIVERYMODE_NMI                 = 4,
     448    XAPICDELIVERYMODE_INIT                = 5,
     449    XAPICDELIVERYMODE_STARTUP             = 6,
     450    XAPICDELIVERYMODE_EXTINT              = 7
     451} XAPICDELIVERYMODE;
     452
     453/**
     454 * xAPIC trigger mode.
     455 */
     456typedef enum XAPICTRIGGERMODE
     457{
     458    XAPICTRIGGERMODE_EDGE = 0,
     459    XAPICTRIGGERMODE_LEVEL
     460} XAPICTRIGGERMODE;
     461/** @} */
     462
     463
    60464DECLINLINE(uint32_t) ApicRegRead(void *pvBase, uint32_t offReg)
    61465{
  • trunk/include/VBox/vmm/apic.h

    r82968 r84652  
    3131
    3232#include <VBox/types.h>
     33#include <VBox/apic.h>
    3334struct PDMDEVREGCB;
    3435
     
    3738 * @{
    3839 */
    39 
    40 /** Offset of APIC ID Register. */
    41 #define XAPIC_OFF_ID                         0x020
    42 /** Offset of APIC Version Register. */
    43 #define XAPIC_OFF_VERSION                    0x030
    44 /** Offset of Task Priority Register. */
    45 #define XAPIC_OFF_TPR                        0x080
    46 /** Offset of Arbitrartion Priority register. */
    47 #define XAPIC_OFF_APR                        0x090
    48 /** Offset of Processor Priority register. */
    49 #define XAPIC_OFF_PPR                        0x0A0
    50 /** Offset of End Of Interrupt register. */
    51 #define XAPIC_OFF_EOI                        0x0B0
    52 /** Offset of Remote Read Register. */
    53 #define XAPIC_OFF_RRD                        0x0C0
    54 /** Offset of Logical Destination Register. */
    55 #define XAPIC_OFF_LDR                        0x0D0
    56 /** Offset of Destination Format Register. */
    57 #define XAPIC_OFF_DFR                        0x0E0
    58 /** Offset of Spurious Interrupt Vector Register. */
    59 #define XAPIC_OFF_SVR                        0x0F0
    60 /** Offset of In-service Register (bits 31:0). */
    61 #define XAPIC_OFF_ISR0                       0x100
    62 /** Offset of In-service Register (bits 63:32). */
    63 #define XAPIC_OFF_ISR1                       0x110
    64 /** Offset of In-service Register (bits 95:64). */
    65 #define XAPIC_OFF_ISR2                       0x120
    66 /** Offset of In-service Register (bits 127:96). */
    67 #define XAPIC_OFF_ISR3                       0x130
    68 /** Offset of In-service Register (bits 159:128). */
    69 #define XAPIC_OFF_ISR4                       0x140
    70 /** Offset of In-service Register (bits 191:160). */
    71 #define XAPIC_OFF_ISR5                       0x150
    72 /** Offset of In-service Register (bits 223:192). */
    73 #define XAPIC_OFF_ISR6                       0x160
    74 /** Offset of In-service Register (bits 255:224). */
    75 #define XAPIC_OFF_ISR7                       0x170
    76 /** Offset of Trigger Mode Register (bits 31:0). */
    77 #define XAPIC_OFF_TMR0                       0x180
    78 /** Offset of Trigger Mode Register (bits 63:32). */
    79 #define XAPIC_OFF_TMR1                       0x190
    80 /** Offset of Trigger Mode Register (bits 95:64). */
    81 #define XAPIC_OFF_TMR2                       0x1A0
    82 /** Offset of Trigger Mode Register (bits 127:96). */
    83 #define XAPIC_OFF_TMR3                       0x1B0
    84 /** Offset of Trigger Mode Register (bits 159:128). */
    85 #define XAPIC_OFF_TMR4                       0x1C0
    86 /** Offset of Trigger Mode Register (bits 191:160). */
    87 #define XAPIC_OFF_TMR5                       0x1D0
    88 /** Offset of Trigger Mode Register (bits 223:192). */
    89 #define XAPIC_OFF_TMR6                       0x1E0
    90 /** Offset of Trigger Mode Register (bits 255:224). */
    91 #define XAPIC_OFF_TMR7                       0x1F0
    92 /** Offset of Interrupt Request Register (bits 31:0). */
    93 #define XAPIC_OFF_IRR0                       0x200
    94 /** Offset of Interrupt Request Register (bits 63:32). */
    95 #define XAPIC_OFF_IRR1                       0x210
    96 /** Offset of Interrupt Request Register (bits 95:64). */
    97 #define XAPIC_OFF_IRR2                       0x220
    98 /** Offset of Interrupt Request Register (bits 127:96). */
    99 #define XAPIC_OFF_IRR3                       0x230
    100 /** Offset of Interrupt Request Register (bits 159:128). */
    101 #define XAPIC_OFF_IRR4                       0x240
    102 /** Offset of Interrupt Request Register (bits 191:160). */
    103 #define XAPIC_OFF_IRR5                       0x250
    104 /** Offset of Interrupt Request Register (bits 223:192). */
    105 #define XAPIC_OFF_IRR6                       0x260
    106 /** Offset of Interrupt Request Register (bits 255:224). */
    107 #define XAPIC_OFF_IRR7                       0x270
    108 /** Offset of Error Status Register. */
    109 #define XAPIC_OFF_ESR                        0x280
    110 /** Offset of LVT CMCI Register. */
    111 #define XAPIC_OFF_LVT_CMCI                   0x2F0
    112 /** Offset of Interrupt Command Register - Lo. */
    113 #define XAPIC_OFF_ICR_LO                     0x300
    114 /** Offset of Interrupt Command Register - Hi. */
    115 #define XAPIC_OFF_ICR_HI                     0x310
    116 /** Offset of LVT Timer Register. */
    117 #define XAPIC_OFF_LVT_TIMER                  0x320
    118 /** Offset of LVT Thermal Sensor Register. */
    119 #define XAPIC_OFF_LVT_THERMAL                0x330
    120 /** Offset of LVT Performance Counter Register. */
    121 #define XAPIC_OFF_LVT_PERF                   0x340
    122 /** Offset of LVT LINT0 Register. */
    123 #define XAPIC_OFF_LVT_LINT0                  0x350
    124 /** Offset of LVT LINT1 Register. */
    125 #define XAPIC_OFF_LVT_LINT1                  0x360
    126 /** Offset of LVT Error Register . */
    127 #define XAPIC_OFF_LVT_ERROR                  0x370
    128 /** Offset of Timer Initial Count Register. */
    129 #define XAPIC_OFF_TIMER_ICR                  0x380
    130 /** Offset of Timer Current Count Register. */
    131 #define XAPIC_OFF_TIMER_CCR                  0x390
    132 /** Offset of Timer Divide Configuration Register. */
    133 #define XAPIC_OFF_TIMER_DCR                  0x3E0
    134 /** Offset of Self-IPI Register (x2APIC only). */
    135 #define X2APIC_OFF_SELF_IPI                  0x3F0
    136 
    137 /** Offset of LVT range start. */
    138 #define XAPIC_OFF_LVT_START                  XAPIC_OFF_LVT_TIMER
    139 /** Offset of LVT range end (inclusive).  */
    140 #define XAPIC_OFF_LVT_END                    XAPIC_OFF_LVT_ERROR
    141 /** Offset of LVT extended range start. */
    142 #define XAPIC_OFF_LVT_EXT_START              XAPIC_OFF_LVT_CMCI
    143 /** Offset of LVT extended range end (inclusive). */
    144 #define XAPIC_OFF_LVT_EXT_END                XAPIC_OFF_LVT_CMCI
    145 /** Offset of the last register (incl. reserved) in the xAPIC/x2APIC range. */
    146 #define XAPIC_OFF_END                        0x3F0
    147 
    148 /**
    149  * xAPIC trigger mode.
    150  */
    151 typedef enum XAPICTRIGGERMODE
    152 {
    153     XAPICTRIGGERMODE_EDGE = 0,
    154     XAPICTRIGGERMODE_LEVEL
    155 } XAPICTRIGGERMODE;
    15640
    15741RT_C_DECLS_BEGIN
  • trunk/src/VBox/VMM/VMMAll/APICAll.cpp

    r82968 r84652  
    2222#define LOG_GROUP LOG_GROUP_DEV_APIC
    2323#include "APICInternal.h"
     24#include <VBox/vmm/apic.h>
    2425#include <VBox/vmm/pdmdev.h>
    2526#include <VBox/vmm/pdmapi.h>
  • trunk/src/VBox/VMM/VMMR3/APIC.cpp

    r82968 r84652  
    2323#include <VBox/log.h>
    2424#include "APICInternal.h"
     25#include <VBox/vmm/apic.h>
    2526#include <VBox/vmm/cpum.h>
    2627#include <VBox/vmm/hm.h>
  • trunk/src/VBox/VMM/include/APICInternal.h

    r82968 r84652  
    2222#endif
    2323
     24#include <VBox/apic.h>
    2425#include <VBox/sup.h>
    25 #include <VBox/vmm/pdmdev.h> /* before apic.h! */
    26 #include <VBox/vmm/apic.h>
     26#include <VBox/vmm/pdmdev.h>
    2727
    2828/** @defgroup grp_apic_int       Internal
     
    3232 */
    3333
    34 /** The APIC hardware version number for Pentium 4. */
    35 #define XAPIC_HARDWARE_VERSION_P4            UINT8_C(0x14)
    36 /** Maximum number of LVT entries for Pentium 4. */
    37 #define XAPIC_MAX_LVT_ENTRIES_P4             UINT8_C(6)
    38 /** Size of the APIC ID bits for Pentium 4. */
    39 #define XAPIC_APIC_ID_BIT_COUNT_P4           UINT8_C(8)
    40 
    41 /** The APIC hardware version number for Pentium 6. */
    42 #define XAPIC_HARDWARE_VERSION_P6            UINT8_C(0x10)
    43 /** Maximum number of LVT entries for Pentium 6. */
    44 #define XAPIC_MAX_LVT_ENTRIES_P6             UINT8_C(4)
    45 /** Size of the APIC ID bits for Pentium 6. */
    46 #define XAPIC_APIC_ID_BIT_COUNT_P6           UINT8_C(4)
    47 
    4834/** The APIC hardware version we are emulating. */
    4935#define XAPIC_HARDWARE_VERSION               XAPIC_HARDWARE_VERSION_P4
     36
     37#if XAPIC_HARDWARE_VERSION == XAPIC_HARDWARE_VERSION_P4
     38#define XAPIC_SVR_VALID                      XAPIC_SVR_VALID_P4
     39#define XAPIC_ID_BROADCAST_MASK              XAPIC_ID_BROADCAST_MASK_P4
     40#else
     41# error "Implement Pentium and P6 family APIC architectures"
     42#endif
    5043
    5144#define VMCPU_TO_XAPICPAGE(a_pVCpu)          ((PXAPICPAGE)(CTX_SUFF((a_pVCpu)->apic.s.pvApicPage)))
     
    6760#define APICCPU_TO_CXAPICPAGE(a_ApicCpu)     ((PCXAPICPAGE)(CTX_SUFF((a_ApicCpu)->pvApicPage)))
    6861
     62/** Vector offset in an APIC 256-bit sparse register. */
     63#define XAPIC_REG256_VECTOR_OFF(a_Vector)    (((a_Vector) & UINT32_C(0xe0)) >> 1)
     64/** Bit position at offset in an APIC 256-bit sparse register. */
     65#define XAPIC_REG256_VECTOR_BIT(a_Vector)    ((a_Vector) & UINT32_C(0x1f))
     66
     67/** Maximum valid offset for a register (16-byte aligned, 4 byte wide access). */
     68#define XAPIC_OFF_MAX_VALID                  (sizeof(XAPICPAGE) - 4 * sizeof(uint32_t))
     69
    6970/** Whether the APIC is in X2APIC mode or not. */
    7071#define XAPIC_IN_X2APIC_MODE(a_pVCpu)        (   (  ((a_pVCpu)->apic.s.uApicBaseMsr) \
    7172                                                  & (MSR_IA32_APICBASE_EN | MSR_IA32_APICBASE_EXTD)) \
    7273                                              ==    (MSR_IA32_APICBASE_EN | MSR_IA32_APICBASE_EXTD) )
    73 
    74 /** Get an xAPIC page offset for an x2APIC MSR value. */
    75 #define X2APIC_GET_XAPIC_OFF(a_uMsr)         ((((a_uMsr) - MSR_IA32_X2APIC_START) << 4) & UINT32_C(0xff0))
    76 /** Get an x2APIC MSR for an xAPIC page offset. */
    77 #define XAPIC_GET_X2APIC_MSR(a_offReg)       ((((a_offReg) & UINT32_C(0xff0)) >> 4) | MSR_IA32_X2APIC_START)
    78 
    79 /** Illegal APIC vector value start. */
    80 #define XAPIC_ILLEGAL_VECTOR_START           UINT8_C(0)
    81 /** Illegal APIC vector value end (inclusive). */
    82 #define XAPIC_ILLEGAL_VECTOR_END             UINT8_C(15)
    83 /** Reserved APIC vector value start. */
    84 #define XAPIC_RSVD_VECTOR_START              UINT8_C(16)
    85 /** Reserved APIC vector value end (inclusive). */
    86 #define XAPIC_RSVD_VECTOR_END                UINT8_C(31)
    87 
    88 /** Vector offset in an APIC 256-bit sparse register. */
    89 #define XAPIC_REG256_VECTOR_OFF(a_Vector)    (((a_Vector) & UINT32_C(0xe0)) >> 1)
    90 /** Bit position at offset in an APIC 256-bit sparse register. */
    91 #define XAPIC_REG256_VECTOR_BIT(a_Vector)    ((a_Vector) & UINT32_C(0x1f))
    92 
    93 /** Maximum valid offset for a register (16-byte aligned, 4 byte wide access). */
    94 #define XAPIC_OFF_MAX_VALID                  (sizeof(XAPICPAGE) - 4 * sizeof(uint32_t))
    95 
    96 #if XAPIC_HARDWARE_VERSION == XAPIC_HARDWARE_VERSION_P6
    97 /** ESR - Send checksum error. */
    98 # define XAPIC_ESR_SEND_CHKSUM_ERROR         RT_BIT(0)
    99 /** ESR - Send accept error. */
    100 # define XAPIC_ESR_RECV_CHKSUM_ERROR         RT_BIT(1)
    101 /** ESR - Send accept error. */
    102 # define XAPIC_ESR_SEND_ACCEPT_ERROR         RT_BIT(2)
    103 /** ESR - Receive accept error. */
    104 # define XAPIC_ESR_RECV_ACCEPT_ERROR         RT_BIT(3)
    105 #endif
    106 /** ESR - Redirectable IPI. */
    107 #define XAPIC_ESR_REDIRECTABLE_IPI           RT_BIT(4)
    108 /** ESR - Send accept error. */
    109 #define XAPIC_ESR_SEND_ILLEGAL_VECTOR        RT_BIT(5)
    110 /** ESR - Send accept error. */
    111 #define XAPIC_ESR_RECV_ILLEGAL_VECTOR        RT_BIT(6)
    112 /** ESR - Send accept error. */
    113 #define XAPIC_ESR_ILLEGAL_REG_ADDRESS        RT_BIT(7)
    114 /** ESR - Valid write-only bits. */
    115 #define XAPIC_ESR_WO_VALID                   UINT32_C(0x0)
    116 
    117 /** TPR - Valid bits. */
    118 #define XAPIC_TPR_VALID                      UINT32_C(0xff)
    119 /** TPR - Task-priority class. */
    120 #define XAPIC_TPR_TP                         UINT32_C(0xf0)
    121 /** TPR - Task-priority subclass. */
    122 #define XAPIC_TPR_TP_SUBCLASS                UINT32_C(0x0f)
    123 /** TPR - Gets the task-priority class. */
    124 #define XAPIC_TPR_GET_TP(a_Tpr)              ((a_Tpr) & XAPIC_TPR_TP)
    125 /** TPR - Gets the task-priority subclass. */
    126 #define XAPIC_TPR_GET_TP_SUBCLASS(a_Tpr)     ((a_Tpr) & XAPIC_TPR_TP_SUBCLASS)
    127 
    128 /** PPR - Valid bits. */
    129 #define XAPIC_PPR_VALID                      UINT32_C(0xff)
    130 /** PPR - Processor-priority class. */
    131 #define XAPIC_PPR_PP                         UINT32_C(0xf0)
    132 /** PPR - Processor-priority subclass. */
    133 #define XAPIC_PPR_PP_SUBCLASS                UINT32_C(0x0f)
    134 /** PPR - Get the processor-priority class. */
    135 #define XAPIC_PPR_GET_PP(a_Ppr)              ((a_Ppr) & XAPIC_PPR_PP)
    136 /** PPR - Get the processor-priority subclass. */
    137 #define XAPIC_PPR_GET_PP_SUBCLASS(a_Ppr)     ((a_Ppr) & XAPIC_PPR_PP_SUBCLASS)
    138 
    139 /** Timer mode - One-shot. */
    140 #define XAPIC_TIMER_MODE_ONESHOT             UINT32_C(0)
    141 /** Timer mode - Periodic. */
    142 #define XAPIC_TIMER_MODE_PERIODIC            UINT32_C(1)
    143 /** Timer mode - TSC deadline. */
    144 #define XAPIC_TIMER_MODE_TSC_DEADLINE        UINT32_C(2)
    145 
    146 /** LVT - The vector. */
    147 #define XAPIC_LVT_VECTOR                     UINT32_C(0xff)
    148 /** LVT - Gets the vector from an LVT entry. */
    149 #define XAPIC_LVT_GET_VECTOR(a_Lvt)          ((a_Lvt) & XAPIC_LVT_VECTOR)
    150 /** LVT - The mask. */
    151 #define XAPIC_LVT_MASK                       RT_BIT(16)
    152 /** LVT - Is the LVT masked? */
    153 #define XAPIC_LVT_IS_MASKED(a_Lvt)           RT_BOOL((a_Lvt) & XAPIC_LVT_MASK)
    154 /** LVT - Timer mode. */
    155 #define XAPIC_LVT_TIMER_MODE                 RT_BIT(17)
    156 /** LVT - Timer TSC-deadline timer mode. */
    157 #define XAPIC_LVT_TIMER_TSCDEADLINE          RT_BIT(18)
    158 /** LVT - Gets the timer mode. */
    159 #define XAPIC_LVT_GET_TIMER_MODE(a_Lvt)      (XAPICTIMERMODE)(((a_Lvt) >> 17) & UINT32_C(3))
    160 /** LVT - Delivery mode. */
    161 #define XAPIC_LVT_DELIVERY_MODE              (RT_BIT(8) | RT_BIT(9) | RT_BIT(10))
    162 /** LVT - Gets the delivery mode. */
    163 #define XAPIC_LVT_GET_DELIVERY_MODE(a_Lvt)   (XAPICDELIVERYMODE)(((a_Lvt) >> 8) & UINT32_C(7))
    164 /** LVT - Delivery status. */
    165 #define XAPIC_LVT_DELIVERY_STATUS            RT_BIT(12)
    166 /** LVT - Trigger mode. */
    167 #define XAPIC_LVT_TRIGGER_MODE               RT_BIT(15)
    168 /** LVT - Gets the trigger mode. */
    169 #define XAPIC_LVT_GET_TRIGGER_MODE(a_Lvt)    (XAPICTRIGGERMODE)(((a_Lvt) >> 15) & UINT32_C(1))
    170 /** LVT - Remote IRR. */
    171 #define XAPIC_LVT_REMOTE_IRR                 RT_BIT(14)
    172 /** LVT - Gets the Remote IRR. */
    173 #define XAPIC_LVT_GET_REMOTE_IRR(a_Lvt)      (((a_Lvt) >> 14) & 1)
    174 /** LVT - Interrupt Input Pin Polarity. */
    175 #define XAPIC_LVT_POLARITY                   RT_BIT(13)
    176 /** LVT - Gets the Interrupt Input Pin Polarity. */
    177 #define XAPIC_LVT_GET_POLARITY(a_Lvt)        (((a_Lvt) >> 13) & 1)
    178 /** LVT - Valid bits common to all LVTs. */
    179 #define XAPIC_LVT_COMMON_VALID               (XAPIC_LVT_VECTOR | XAPIC_LVT_DELIVERY_STATUS | XAPIC_LVT_MASK)
    180 /** LVT CMCI - Valid bits. */
    181 #define XAPIC_LVT_CMCI_VALID                 (XAPIC_LVT_COMMON_VALID | XAPIC_LVT_DELIVERY_MODE)
    182 /** LVT Timer - Valid bits. */
    183 #define XAPIC_LVT_TIMER_VALID                (XAPIC_LVT_COMMON_VALID | XAPIC_LVT_TIMER_MODE | XAPIC_LVT_TIMER_TSCDEADLINE)
    184 /** LVT Thermal - Valid bits. */
    185 #define XAPIC_LVT_THERMAL_VALID              (XAPIC_LVT_COMMON_VALID | XAPIC_LVT_DELIVERY_MODE)
    186 /** LVT Perf - Valid bits. */
    187 #define XAPIC_LVT_PERF_VALID                 (XAPIC_LVT_COMMON_VALID | XAPIC_LVT_DELIVERY_MODE)
    188 /** LVT LINTx - Valid bits. */
    189 #define XAPIC_LVT_LINT_VALID                 (  XAPIC_LVT_COMMON_VALID | XAPIC_LVT_DELIVERY_MODE | XAPIC_LVT_DELIVERY_STATUS \
    190                                               | XAPIC_LVT_POLARITY | XAPIC_LVT_REMOTE_IRR | XAPIC_LVT_TRIGGER_MODE)
    191 /** LVT Error - Valid bits. */
    192 #define XAPIC_LVT_ERROR_VALID                (XAPIC_LVT_COMMON_VALID)
    193 
    194 /** SVR - The vector. */
    195 #define XAPIC_SVR_VECTOR                     UINT32_C(0xff)
    196 /** SVR - APIC Software enable. */
    197 #define XAPIC_SVR_SOFTWARE_ENABLE            RT_BIT(8)
    198 /** SVR - Supress EOI broadcast. */
    199 #define XAPIC_SVR_SUPRESS_EOI_BROADCAST      RT_BIT(12)
    200 #if XAPIC_HARDWARE_VERSION == XAPIC_HARDWARE_VERSION_P4
    201 /** SVR - Valid bits. */
    202 # define XAPIC_SVR_VALID                     (XAPIC_SVR_VECTOR | XAPIC_SVR_SOFTWARE_ENABLE)
    203 #else
    204 # error "Implement Pentium and P6 family APIC architectures"
    205 #endif
    206 
    207 /** DFR - Valid bits. */
    208 #define XAPIC_DFR_VALID                      UINT32_C(0xf0000000)
    209 /** DFR - Reserved bits that must always remain set. */
    210 #define XAPIC_DFR_RSVD_MB1                   UINT32_C(0x0fffffff)
    211 /** DFR - The model. */
    212 #define XAPIC_DFR_MODEL                      UINT32_C(0xf)
    213 /** DFR - Gets the destination model. */
    214 #define XAPIC_DFR_GET_MODEL(a_uReg)          (((a_uReg) >> 28) & XAPIC_DFR_MODEL)
    215 
    216 /** LDR - Valid bits. */
    217 #define XAPIC_LDR_VALID                      UINT32_C(0xff000000)
    218 /** LDR - Cluster ID mask (x2APIC). */
    219 #define X2APIC_LDR_CLUSTER_ID                UINT32_C(0xffff0000)
    220 /** LDR - Mask of the LDR cluster ID (x2APIC). */
    221 #define X2APIC_LDR_GET_CLUSTER_ID(a_uReg)    ((a_uReg) & X2APIC_LDR_CLUSTER_ID)
    222 /** LDR - Mask of the LDR logical ID (x2APIC). */
    223 #define X2APIC_LDR_LOGICAL_ID                UINT32_C(0x0000ffff)
    224 
    225 /** LDR - Flat mode logical ID mask. */
    226 #define XAPIC_LDR_FLAT_LOGICAL_ID            UINT32_C(0xff)
    227 /** LDR - Clustered mode cluster ID mask. */
    228 #define XAPIC_LDR_CLUSTERED_CLUSTER_ID       UINT32_C(0xf0)
    229 /** LDR - Clustered mode logical ID mask. */
    230 #define XAPIC_LDR_CLUSTERED_LOGICAL_ID       UINT32_C(0x0f)
    231 /** LDR - Gets the clustered mode cluster ID. */
    232 #define XAPIC_LDR_CLUSTERED_GET_CLUSTER_ID(a_uReg)   ((a_uReg) & XAPIC_LDR_CLUSTERED_CLUSTER_ID)
    233 
    234 
    235 /** EOI - Valid write-only bits. */
    236 #define XAPIC_EOI_WO_VALID                   UINT32_C(0x0)
    237 /** Timer ICR - Valid bits. */
    238 #define XAPIC_TIMER_ICR_VALID                UINT32_C(0xffffffff)
    239 /** Timer DCR - Valid bits. */
    240 #define XAPIC_TIMER_DCR_VALID                (RT_BIT(0) | RT_BIT(1) | RT_BIT(3))
    241 
    242 /** Self IPI - Valid bits. */
    243 #define XAPIC_SELF_IPI_VALID                 UINT32_C(0xff)
    244 /** Self IPI - The vector. */
    245 #define XAPIC_SELF_IPI_VECTOR                UINT32_C(0xff)
    246 /** Self IPI - Gets the vector. */
    247 #define XAPIC_SELF_IPI_GET_VECTOR(a_uReg)    ((a_uReg) & XAPIC_SELF_IPI_VECTOR)
    248 
    249 /** ICR Low - The Vector. */
    250 #define XAPIC_ICR_LO_VECTOR                  UINT32_C(0xff)
    251 /** ICR Low - Gets the vector. */
    252 #define XAPIC_ICR_LO_GET_VECTOR(a_uIcr)      ((a_uIcr) & XAPIC_ICR_LO_VECTOR)
    253 /** ICR Low - The delivery mode. */
    254 #define XAPIC_ICR_LO_DELIVERY_MODE           (RT_BIT(8) | RT_BIT(9) | RT_BIT(10))
    255 /** ICR Low - The destination mode. */
    256 #define XAPIC_ICR_LO_DEST_MODE               RT_BIT(11)
    257 /** ICR Low - The delivery status. */
    258 #define XAPIC_ICR_LO_DELIVERY_STATUS         RT_BIT(12)
    259 /** ICR Low - The level. */
    260 #define XAPIC_ICR_LO_LEVEL                   RT_BIT(14)
    261 /** ICR Low - The trigger mode. */
    262 #define XAPIC_ICR_TRIGGER_MODE               RT_BIT(15)
    263 /** ICR Low - The destination shorthand. */
    264 #define XAPIC_ICR_LO_DEST_SHORTHAND          (RT_BIT(18) | RT_BIT(19))
    265 /** ICR Low - Valid write bits. */
    266 #define XAPIC_ICR_LO_WR_VALID                (  XAPIC_ICR_LO_VECTOR | XAPIC_ICR_LO_DELIVERY_MODE | XAPIC_ICR_LO_DEST_MODE \
    267                                               | XAPIC_ICR_LO_LEVEL | XAPIC_ICR_TRIGGER_MODE | XAPIC_ICR_LO_DEST_SHORTHAND)
    268 
    269 /** ICR High - The destination field. */
    270 #define XAPIC_ICR_HI_DEST                    UINT32_C(0xff000000)
    271 /** ICR High - Get the destination field. */
    272 #define XAPIC_ICR_HI_GET_DEST(a_u32IcrHi)    (((a_u32IcrHi) >> 24) & XAPIC_ICR_HI_DEST)
    273 /** ICR High - Valid write bits in xAPIC mode. */
    274 #define XAPIC_ICR_HI_WR_VALID                XAPIC_ICR_HI_DEST
    275 
    276 /** APIC ID broadcast mask - x2APIC mode. */
    277 #define X2APIC_ID_BROADCAST_MASK             UINT32_C(0xffffffff)
    278 #if XAPIC_HARDWARE_VERSION == XAPIC_HARDWARE_VERSION_P4
    279 /** APIC ID broadcast mask - xAPIC mode. */
    280 # define XAPIC_ID_BROADCAST_MASK             UINT32_C(0xff)
    281 #else
    282 # error "Implement Pentium and P6 family APIC architectures"
    283 #endif
    28474
    28575/**
     
    1055845    APICMSRACCESS_COUNT
    1056846} APICMSRACCESS;
    1057 
    1058 /** @name xAPIC Destination Format Register bits.
    1059  * See Intel spec. 10.6.2.2 "Logical Destination Mode".
    1060  * @{ */
    1061 typedef enum XAPICDESTFORMAT
    1062 {
    1063     XAPICDESTFORMAT_FLAT    = 0xf,
    1064     XAPICDESTFORMAT_CLUSTER = 0
    1065 } XAPICDESTFORMAT;
    1066 /** @} */
    1067 
    1068 /** @name xAPIC Timer Mode bits.
    1069  * See Intel spec. 10.5.1 "Local Vector Table".
    1070  * @{ */
    1071 typedef enum XAPICTIMERMODE
    1072 {
    1073     XAPICTIMERMODE_ONESHOT      = XAPIC_TIMER_MODE_ONESHOT,
    1074     XAPICTIMERMODE_PERIODIC     = XAPIC_TIMER_MODE_PERIODIC,
    1075     XAPICTIMERMODE_TSC_DEADLINE = XAPIC_TIMER_MODE_TSC_DEADLINE
    1076 } XAPICTIMERMODE;
    1077 /** @} */
    1078 
    1079 /** @name xAPIC Interrupt Command Register bits.
    1080  * See Intel spec. 10.6.1 "Interrupt Command Register (ICR)".
    1081  * See Intel spec. 10.5.1 "Local Vector Table".
    1082  * @{ */
    1083 /**
    1084  * xAPIC destination shorthand.
    1085  */
    1086 typedef enum XAPICDESTSHORTHAND
    1087 {
    1088     XAPICDESTSHORTHAND_NONE = 0,
    1089     XAPICDESTSHORTHAND_SELF,
    1090     XAPIDDESTSHORTHAND_ALL_INCL_SELF,
    1091     XAPICDESTSHORTHAND_ALL_EXCL_SELF
    1092 } XAPICDESTSHORTHAND;
    1093 
    1094 /**
    1095  * xAPIC INIT level de-assert delivery mode.
    1096  */
    1097 typedef enum XAPICINITLEVEL
    1098 {
    1099     XAPICINITLEVEL_DEASSERT = 0,
    1100     XAPICINITLEVEL_ASSERT
    1101 } XAPICLEVEL;
    1102 
    1103 /**
    1104  * xAPIC destination mode.
    1105  */
    1106 typedef enum XAPICDESTMODE
    1107 {
    1108     XAPICDESTMODE_PHYSICAL = 0,
    1109     XAPICDESTMODE_LOGICAL
    1110 } XAPICDESTMODE;
    1111 
    1112 /**
    1113  * xAPIC delivery mode type.
    1114  */
    1115 typedef enum XAPICDELIVERYMODE
    1116 {
    1117     XAPICDELIVERYMODE_FIXED               = 0,
    1118     XAPICDELIVERYMODE_LOWEST_PRIO         = 1,
    1119     XAPICDELIVERYMODE_SMI                 = 2,
    1120     XAPICDELIVERYMODE_NMI                 = 4,
    1121     XAPICDELIVERYMODE_INIT                = 5,
    1122     XAPICDELIVERYMODE_STARTUP             = 6,
    1123     XAPICDELIVERYMODE_EXTINT              = 7
    1124 } XAPICDELIVERYMODE;
    1125847/** @} */
    1126848
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette