Files
2026-07-30 11:19:44 +05:30

242 lines
8.0 KiB
C

/* vbiX86Arch.h - x86 architecture specific definitions */
/*
* Copyright (c) 2009-2012 Wind River Systems, Inc.
*
* The right to copy, distribute, modify or otherwise make use
* of this software may be licensed only pursuant to the terms
* of an applicable Wind River license agreement.
*/
/*
modification history
--------------------
01q,26apr12,jjk WIND00344535 - Fix build warnings
01q,17feb12,c_t sync with HV 2.0 27-jan-12 DVD
01p,04apr11,jlv Sync with HV 1.3 01-Apr-11(WIND00265419)
01o,08feb11,jlv Sync with HV 1.3 04-Feb-11 DVD
01n,28dec10,jlv Fix compiler warning with 64-bit build
01m,28sep10,jl add inline wrhvAmpCpuHreg32Set
01l,24may10,jl Sync with HV 1.2 25-May-10
01k,20may10,rgo fix unresolved _RType
01j,03mar10,rgo sync-up with hv1.2 view on 3/3/10
01i,31aug09,mmi move VBI_HREG_SET to vbiX86Arch.h
01h,26aug09,mmi fix WIND00178026: update file name
01g,17aug09,md fix comments
01f,14aug09,md update to match hypervisor version
01e,28jul09,mpk add hardware register set to vbi
01d,08jun09,md add define for maximum number of cores
01c,25may09,md add byte order define
01b,06feb09,mmi add MAX interrupts definition
01a,14jan09,mmi created
*/
#ifndef __INCvbiX86Archh
#define __INCvbiX86Archh
#ifdef __cplusplus
extern "C" {
#endif
#ifndef _ASMLANGUAGE
/* structure of the system descriptor table registers (VBI_GDTR, VBI_IDTR, VBI_LDTR) */
struct VBI_XDTR64
{
uint16_t limit; /* maximum size of the DT */
uint64_t base; /* address of DT */
uint16_t pad[3];
} __attribute__((packed));
struct VBI_XDTR32
{
uint16_t limit;
uint32_t base;
uint16_t pad;
} __attribute__((packed));
typedef struct VBI_XDTR64 VBI_GDTR;
typedef struct VBI_XDTR64 VBI_IDTR;
typedef struct VBI_XDTR64 VBI_LDTR;
typedef struct VBI_XDTR32 VBI_GDTR32;
typedef struct VBI_XDTR32 VBI_IDTR32;
typedef struct VBI_XDTR32 VBI_LDTR32;
/*******************************************************************************
*
* VBI_HREG_SET - hardware register set, for read/write
*
* Used by vbiVbRegisterRead/vbiVbRegisterWrite to read/write registers in
* another VB
*
* SYNOPSIS
*
* VB hardware register set C data structure type definition
*
*\cs
* typedef struct /@ VB_REG_SET - used for sys_regsRead/Write @/
* {
* vbiRType32_t eax; /@ 00: general register @/
* vbiRType32_t ebx; /@ 04: general register @/
* vbiRType32_t ecx; /@ 08: general register @/
* vbiRType32_t edx; /@ 0C: general register @/
* vbiRType32_t esi; /@ 10: general register @/
* vbiRType32_t edi; /@ 14: general register @/
* vbiRType32_t eip; /@ 18: program counter @/
* vbiRType32_t ebp; /@ 1C: frame pointer register @/
* vbiRType32_t esp; /@ 20: stack pointer register @/
* vbiRType32_t eflags; /@ 24: status register @/
* vbiRType32_t cr0; /@ 28: control register 0 @/
* vbiRType32_t cr3; /@ 2C: control register 3 @/
* vbiRType32_t cr4; /@ 30: control register 4 @/
* vbiRType32_t idtr; /@ 34: IDT task register @/
* vbiRType32_t gdtr; /@ 38: GDT task register @/
* vbiRType32_t ldtr; /@ 3C: LDT task register @/
* vbiRType32_t cs; /@ 40: code segment @/
* vbiRType32_t ss; /@ 44: stack segment @/
* vbiRType32_t ds; /@ 48: data segment @/
* vbiRType32_t es; /@ 4C: E segment @/
* vbiRType32_t fs; /@ 50: F segment @/
* vbiRType32_t gs; /@ 54: G segment @/
* vbiRType32_t tr; /@ 58: task register @/
* } VBI_HREG_SET;
*
*\ce
* SEE ALSO: NONE
*
*/
typedef struct /* VBI_REG_SET - used for sys_regsRead/Write */
{
vbiRType32_t eax; /* 00: general register */
vbiRType32_t ebx; /* 04: general register */
vbiRType32_t ecx; /* 08: general register */
vbiRType32_t edx; /* 0C: general register */
vbiRType32_t esi; /* 10: general register */
vbiRType32_t edi; /* 14: general register */
vbiRType32_t eip; /* 18: program counter */
vbiRType32_t ebp; /* 1C: frame pointer register */
vbiRType32_t esp; /* 20: stack pointer register */
vbiRType32_t eflags; /* 24: status register */
vbiRType32_t cr0; /* 28: control register 0 */
vbiRType32_t cr3; /* 2C: control register 3 */
vbiRType32_t cr4; /* 30: control register 4 */
VBI_IDTR32 idtr; /* 34: IDT task register */
VBI_GDTR32 gdtr; /* 3C: GDT task register */
VBI_LDTR32 ldtr; /* 44: LDT task register */
vbiRType32_t cs; /* 4C: code segment */
vbiRType32_t ss; /* 50: stack segment */
vbiRType32_t ds; /* 54: data segment */
vbiRType32_t es; /* 58: E segment */
vbiRType32_t fs; /* 5C: F segment */
vbiRType32_t gs; /* 60: G segment */
vbiRType32_t tr; /* 64: task register */
} VBI_HREG_SET;
typedef struct /* REG_SET - x86 register set */
{
vbiRType64_t rax; /* 00: general register */
vbiRType64_t rbx; /* 08: general register */
vbiRType64_t rcx; /* 10: general register */
vbiRType64_t rdx; /* 18: general register */
vbiRType64_t rsp; /* 20: stack pointer register */
vbiRType64_t rbp; /* 28: frame pointer register */
vbiRType64_t rsi; /* 30: general register */
vbiRType64_t rdi; /* 38: general register */
vbiRType64_t r8; /* 40: general register */
vbiRType64_t r9; /* 48: general register */
vbiRType64_t r10; /* 50: general register */
vbiRType64_t r11; /* 58: general register */
vbiRType64_t r12; /* 60: general register */
vbiRType64_t r13; /* 68: general register */
vbiRType64_t r14; /* 70: general register */
vbiRType64_t r15; /* 78: general register */
vbiRType64_t rip; /* 80: program counter */
vbiRType64_t rflags; /* 88: status register */
vbiRType64_t cr0; /* 90: control register 0 */
vbiRType64_t cr2; /* 98: control register 2 */
vbiRType64_t cr3; /* 100: control register 3 */
vbiRType64_t cr4; /* 108: control register 4 */
VBI_IDTR idtr; /* 110: IDT task register */
VBI_GDTR gdtr; /* 11a: GDT task register */
VBI_LDTR ldtr; /* 136: LDT task register */
vbiRType64_t cs; /* 140: code segment */
vbiRType64_t ds; /* 148: data segment */
vbiRType64_t ss; /* 150: stack segment */
vbiRType64_t es; /* 158: E segment */
vbiRType64_t fs; /* 160: F segment */
vbiRType64_t gs; /* 168: G segment */
vbiRType64_t tr; /* 170: Task register */
/* xxx(gws): excluding FP support */
} VBI_HREG_SET_64;
/* complex register set definition */
typedef union
{
VBI_HREG_SET hreg32; /* 32 bit register set */
VBI_HREG_SET_64 hreg64; /* 64 bit register set */
} VBI_HREG_SET_CMPLX;
typedef struct
{
vbiRegSet_t vbiRegType; /* 00: register set to use */
uint32_t qualifier; /* 04: optional field, used for alignment */
VBI_HREG_SET_CMPLX vbiRegSet;
} VBI_HREG_SET_CMPLX_QUALIFIED;
#ifndef _WRS_CONFIG_LP64
/******************************************************************************
*
* wrhvAmpCpuHreg32Set - Init the guestOS of VBI_HREG_SET_CMPLX_QUALIFIED data
* structure.
*
* This function sets the specific parameters which are CPU/Arch dependent
* and it will be called by wrhvAmpCpuEnable before resuming the Virtual Board
* during the GuestOS wrload operation. Note that the register-width is assumed
* to be 32bits.
*
* ERRNO: - N/A
* RETURNS:None
* \NOMANUAL
*
*/
_WRS_INLINE void wrhvAmpCpuHreg32Set
(
VBI_HREG_SET_CMPLX_QUALIFIED * pRegSet,
FUNCPTR entryPt,
vbiGuestPhysAddr_t cfgAddr
)
{
/* IP and eax parameters are set */
pRegSet->vbiRegSet.hreg32.eip = (vbiRType32_t) entryPt;
pRegSet->vbiRegSet.hreg32.eax = (vbiRType32_t) cfgAddr;
return;
}
#endif /* _WRS_CONFIG_LP64 */
#endif /* _ASMLANGUAGE */
/* x86 uses little endian byte ordering */
#define __VBI_BYTE_ORDER __VBI_LITTLE_ENDIAN
#ifdef __cplusplus
}
#endif
#endif /* __INCVbiX86Archh */