HvCallSetVpRegisters 하이퍼콜은 가상 프로세서의 상태를 씁니다.
인터페이스
HV_STATUS
HvCallSetVpRegisters(
_In_ HV_PARTITION_ID PartitionId,
_In_ HV_VP_INDEX VpIndex,
_In_ HV_INPUT_VTL InputVtl,
_Inout_ UINT32* RegisterCount,
_In_reads_(*RegisterCount) const HV_REGISTER_NAME* RegisterNameList,
_In_reads_(*RegisterCount) const HV_REGISTER_VALUE* RegisterValueList
);
상태는 각각 입력으로 제공된 레지스터 이름에 해당하는 일련의 레지스터 값으로 작성됩니다.
레지스터 값이 수정될 때 최소 오류 검사가 수행됩니다. 특히 하이퍼바이저는 레지스터의 예약된 비트가 0으로 설정되고, 항상 0 또는 1을 포함하는 것으로 아키텍처로 정의된 비트가 적절하게 설정되고, 레지스터의 아키텍처 크기를 초과하는 지정된 비트가 0으로 설정되어 있는지 확인합니다.
이 호출은 읽기 전용 레지스터의 값을 수정하는 데 사용할 수 없습니다.
레지스터 수정의 부작용은 수행되지 않습니다. 여기에는 예외 생성, 파이프라인 동기화, TLB 플러시 등이 포함됩니다.
제한 사항
- 호출자는 PartitionId로 지정된 파티션의 부모이거나 지정된 파티션은 "자체"여야 하며 파티션에는 AccessVpRegisters 권한이 있어야 합니다.
호출 코드
0x0051 (담당자)
입력 매개 변수
| 이름 | 상쇄 | Size | 제공된 정보 |
|---|---|---|---|
PartitionId |
0 | 8 | 파티션 ID를 지정합니다. |
VpIndex |
8 | 4 | 가상 프로세서의 인덱스를 지정합니다. |
TargetVtl |
12 | 1 | 는 대상 VTL을 지정합니다. |
| RsvdZ | 13 | 3 |
Input List 요소
| 이름 | 상쇄 | Size | 제공된 정보 |
|---|---|---|---|
RegisterName |
0 | 4 | 수정할 레지스터의 이름을 지정합니다. |
| RsvdZ | 4 | 12 | |
RegisterValue |
16 | 16 | 지정된 레지스터의 새 값을 지정합니다. |
초기 등록 목록(ARM64)
ARM64에서는 게스트 OS ID 레지스터(HvRegisterGuestOsId)가 0이 아닌 값으로 설정되기 전에 이 하이퍼콜을 사용하여 특정 레지스터를 설정할 수 있습니다. 이렇게 하면 부팅 프로세스 중에 중요한 시스템 레지스터를 초기화할 수 있습니다.
게스트 OS 식별 전에 다음 레지스터를 설정할 수 있습니다.
| 등록 이름 | Description |
|---|---|
HvRegisterGuestOsId |
게스트 운영 체제 식별 레지스터 |
HvArm64RegisterSyntheticVbarEl1 |
EL1에 대한 가상 벡터 기본 주소 레지스터 |
HvRegisterGuestCrashCtl |
게스트 크래시 제어 레지스터 |
HvRegisterGuestCrashP0 |
게스트 크래시 매개 변수 0 |
HvRegisterGuestCrashP1 |
게스트 크래시 매개 변수 1 |
HvRegisterGuestCrashP2 |
게스트 크래시 매개 변수 2 |
HvRegisterGuestCrashP3 |
게스트 크래시 매개 변수 3 |
HvRegisterGuestCrashP4 |
게스트 크래시 매개 변수 4 |
다른 모든 레지스터는 이 하이퍼콜을 통해 수정하기 전에 게스트 OS ID를 설정(0이 아닌)해야 합니다.
메모: 0이 아닌 값으로 설정 HvRegisterGuestOsId 하면 하이퍼바이저에 대한 게스트 운영 체제를 식별하고 전체 레지스터 집합에 액세스할 수 있으므로 일반적으로 하이퍼바이저 초기화 시퀀스의 첫 번째 단계가 됩니다.