Skip to content

Latest commit

 

History

History
228 lines (123 loc) · 60.9 KB

cpu-execution.md

File metadata and controls

228 lines (123 loc) · 60.9 KB

언어: English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Français | Deutsch | Español | Italiano | Русский | العربية

← 문서 색인

CPU 실행 및 기능 조회

CPU 실행은 게스트 OS, 이미지 로더, 호출 규약과 독립적입니다. NEVERD_ENABLE_CPU_EMULATION으로 단독 빌드할 수 있고, NEVERD_ENABLE_DRIVER_EMULATION은 Windows 드라이버 모델도 포함합니다. 아키텍처 안내서는 소유권, 백엔드 선택, 플랫폼 제한을 설명합니다.

NEVERD_ENABLE_SEMANTIC_TESTS의 기본값은 ON이며 unittests/semantic의 테스트 그룹과 통합 실행 대상을 제어합니다. Unicorn 없이 네이티브 CPU 테스트를 빌드하려면 BUILD_TESTING=ON을 유지하고 NEVERD_ENABLE_SEMANTIC_TESTS=OFF와 NEVERD_EMULATION_BACKEND_UNICORN=OFF를 설정합니다. 적절한 SDK 헤더가 있는 Windows ARM64/MSVC를 포함하여 네이티브 KVM/WHP 테스트를 계속 빌드할 수 있습니다. Windows ARM64에서 Unicorn을 활성화하려면 ARM64 LLVM-MinGW 도구 모음이 필요합니다. 이 빌드 분리는 ARM64 네이티브 실행 검증을 의미하지 않습니다.

구성

공개 ExecutionConfiguration은 CPU 팩토리와 기능 보고서에서 함께 사용됩니다. CPU 할당이나 주소 공간 연결 전에 요구사항을 검증합니다. 생략한 값은 계약의 고정 프로필을 사용하고, 명시한 미지원 값은 실패합니다.

JSON 필드 기본값 의미
backend auto auto, unicorn, kvm, whp
contract software-cpu-v1 버전이 지정된 실행 의미론
architecture x86_64 x86_64 또는 aarch64
privilege 계약 프로필 flat, supervisor, user; 계약과 일치해야 함
virtual_address_bits 계약 프로필 checked 프로필은 48비트, flat 프로필은 64비트 직접 매핑 이름공간
page_size 4096 게스트 매핑 단위. 다른 값은 거부
required_features [] ExecutionConfiguration.def의 필수 기능 이름

driver-strict는 x64, software-cpu-v1은 x64와 ARM64를 허용합니다. checked-x64-v1 및 checked-aarch64-v1은 지정된 아키텍처와 supervisor 권한을 요구합니다. checked-user-x64-v1과 checked-user-aarch64-v1은 계약에 맞는 제한 명령 목록을 각각 CPL3/EL0에서 실행하며 MMU 격리와 명시적 서비스 요청 종료를 사용합니다. Unicorn 및 호스트와 일치하는 KVM/WHP를 지원하고, auto는 기존 호스트 선택을 따릅니다. direct-user-x64-v1은 시작에 수십억 개의 명령이 필요한 워크로드를 위해 x64 user 명령 집합을 단일 단계로 실행하지 않고 Unicorn 또는 호스트와 일치하는 KVM/WHP 전송에서 아키텍처 이벤트 사이에만 실행합니다. 아무 명령도 허용하지 않으며 명령이나 메모리 접근을 관찰하지 않습니다. CPL3 격리는 게스트 페이지 테이블만으로 제공됩니다. 서비스 경계는 checked-user-x64-v1과 동일합니다. 시스템 호출 확장이 비활성 상태로 유지되므로 서비스 명령은 게스트가 서비스를 요청한 주소에서 정의되지 않은 opcode 이벤트가 되어 동일한 보류 서비스로 보고됩니다. 실행은 명령 예산이나 퀀텀이 아니라 시간 예산을 따릅니다. KVM과 호스트가 일치하는 WHP가 이를 구현합니다. Unicorn도 지원하며 HVF는 지원하지 않습니다. Unicorn은 서비스 명령 훅을 동일한 원래 PC 경계로 변환하고 중단 시 정지 위치의 CPU 상태를 보존합니다. 실행 워치는 계속 적용됩니다. 해당 페이지가 실행 불가로 설정되므로 감시 범위로의 첫 페치는 checked 명령 워치가 멈추는 것과 동일한 경계에서 폴트가 발생합니다. 관찰 기반 언패킹은 명시적 감시 경계 사이에서 진입점을 복원합니다. flat 프로필은 아키텍처 수준 사용자/supervisor MMU 격리를 보장하지 않습니다. checked ARM64와 x64 프로필은 아래의 제한된 FP/SIMD 명령군을 허용합니다. supervisor x64는 제한된 MMIO와 prepared-read 문자열 전송을 추가하고, user 프로필은 장치 매핑을 거부합니다. 포트 I/O는 지원하지 않습니다. service_traps는 user 프로필만 알립니다.

ExecutionSession::watchMemoryWrites는 명령 효과를 커밋한 뒤 RAM 기록 무효화를 알립니다. checked CPU는 물리 바이트 범위를 비교하며 x64 direct 실행은 같은 물리 페이지의 다른 쓰기도 보고할 수 있습니다. 알림은 바이트 변경을 증명하지 않으며 다음 명령을 과금하지 않습니다. 게스트 폴트와 보류 서비스가 우선합니다. 감시는 현재 매핑과 별칭을 따르며 미지원 CPU는 비어 있지 않은 집합을 거부합니다. instructionSize는 실행 디코더로 정지한 명령을 검사하며 게스트 폴트를 발행하지 않습니다.

x64 부분 페이지 감시는 디코딩한 제어 흐름 영역과 내부 실행 중단점을 사용합니다. KVM/WHP는 하드웨어 실행 중단점을, Unicorn은 주소 범위를 제한한 훅을 사용합니다. 알 수 없는 제어 흐름과 너무 많은 출구에는 프로세서 단일 단계를 유지합니다. 물리 코드 페이지의 쓰기 보호는 코드가 바뀌기 전에 계획을 무효화합니다. PUSHF/POPF 재개는 TF를 주입하지 않으며 실제 게스트 #DB는 게스트 예외로 보고합니다. 감시만 변경되면 관련 페이지 테이블 리프를 갱신하고 RAM 참조를 유지합니다. 매핑, 권한 수준, 예외 모니터 또는 전송 물리 창의 변경은 배치 캐시를 무효화합니다. 크기가 제한된 캐시는 비활성 페이지의 별칭을 통한 변경을 포함해 디코딩에 사용한 모든 바이트를 다시 검증한 뒤 제어 흐름 계획을 재사용합니다. 명령 검사는 접근 가능한 접두 부분을 한 번에 읽으며 오류를 일으키는 끝부분은 읽지 않습니다.

사용자 실행은 매핑된 모든 페이지에 UserAccessible과 적절한 Read, Write, Execute 권한을 요구합니다. 기존 매핑은 기본적으로 supervisor용이며, 물리 바이트를 공유하는 별칭도 권한은 독립적입니다. UserAccessible만으로는 접근할 수 없습니다. 신뢰된 호스트 연산과 supervisor CPU는 RWX를 사용합니다. 예:

Configuration.Contract = ExecutionContract::CheckedUserX64;
Configuration.Privilege = ExecutionPrivilege::User;
auto CPU = llvm::cantFail(createExecutionBackend(Configuration, Space)).CPU;
llvm::cantFail(CPU->map(Code, 4096, Read | Write | Execute | UserAccessible));

권한은 계약으로 고정됩니다. 컨텍스트 복원이나 주소 공간 연결로 바뀌지 않으며 x64 세그먼트 선택자로 승격할 수 없습니다. 복구 가능한 데이터 접근 fault는 소유자가 처리할 때까지 원래 명령과 레지스터를 보존합니다. canAccess는 요청한 권한만 정확히 검사하며 사용자 가시성 조회에는 UserAccessible을 포함합니다. 페이지 테이블은 CPU 전용 투영이며 변경 가능한 게스트 페이지 테이블이나 권한 변경 API를 노출하지 않습니다. ARM64에서는 사용자 페이지가 EL1에서 실행 불가합니다.

알 수 없는 필드/null 값, 잘못된 이름·숫자 폭, 중복된 필수 기능, 미지원 조합은 실패합니다. 입력은 64 KiB로 제한되고 기존 CPU 팩토리 및 드라이버 C 옵션은 호환성을 유지합니다.

병렬 CPU와 장치 원자 트랜잭션

KVM, WHP, Unicorn의 checked x64/ARM64에서 ExecutionFeature::ParallelCPUs(parallel_cpus)를 명시적으로 요청할 수 있습니다. 독립 CPU는 서로 다른 호스트 스레드에서 물리 RAM을 공유하며, RAM 쓰기가 없다고 검증한 네이티브 명령은 겹쳐 실행할 수 있습니다. 대기 중인 쓰기는 새 명령 진입을 막고 기존 읽기가 끝난 뒤 게시합니다. 효과는 순차 일관성을 따르며 대기 취소와 롤백을 지원합니다. 모든 실행이 끝날 때까지 매핑 변경과 호스트 쓰기는 금지됩니다. 한 CPU 객체의 스레드 간 호출은 stop()만 지원합니다. 기본 CPU 실행은 협력 방식입니다. OS 스케줄링과 약한 메모리 순서 탐색은 별도 계약입니다.

병렬 WHP CPU는 공유 파티션 안에서 독립적인 VP를 사용하며, 협력 실행용 VP 외에 최대 31개의 병렬 CPU를 동시에 유지합니다. 전용 GPA 영역과 전송 RAM으로 투영을 분리하고 ARM64는 서로 다른 ASID와 비전역 변환을 사용합니다. 네이티브 실행 전에 코드와 선언된 피연산자를 복사하며 선언된 출력 바이트만 공유 RAM 트랜잭션에 전달합니다. 관찰자는 기준 RAM을 읽습니다. KVM과 checked Unicorn은 공유 메모리를 직접 사용합니다. HVF와 Unicorn의 Software 계약은 이 기능을 제공하지 않습니다.

MMIOAtomics(mmio_atomics)는 명시적인 GuestMMIOCallbacks::PrepareAtomic 제공자가 필요합니다. checked supervisor x64는 허용된 교환, 비교 교환, 정수 갱신과 수정 비트 연산을, ARM64는 CASP를 포함한 LSE를 지원합니다. 자연 정렬된 1/2/4/8/16바이트만 허용합니다. x64는 전용 임시 페이지에서 원래 명령을 실행하여 레지스터와 FLAGS를 계산하며 ARM64는 공통 LSE 의미론을 사용합니다. 준비는 부작용이 없고 커밋은 수명과 버전을 검증하여 한 번만 반영합니다. 커밋 전 중지와 실패는 CPU/장치 상태를 보존하며 성공한 커밋은 동시에 도착한 중지보다 우선합니다. 일반 Read+Write 대체는 금지합니다. 커널 레지스터 뱅크는 선언된 1/2/4바이트 폭을 유지하고 동일 값 쓰기, 전원 변경, 소유자 소멸 뒤의 미리보기를 거부합니다. ARM64 일반 장치 전송과 장치 독점 모니터, 사용자 MMIO, 임의의 실제 하드웨어는 포함하지 않습니다.

워크로드를 실행하지 않고 조회

neverd cpu-capabilities
neverd cpu-capabilities \
  --configuration='{"contract":"checked-aarch64-v1","architecture":"aarch64"}' \
  --probe-host

스키마 버전은 1입니다. 보고서는 프로필 기본값 적용 전 requested_configuration, 정규화된 configuration, 정적 의미 지원 capabilities, 어댑터 빌드/ABI 지원 build, 그리고 --probe-host 요청 때만 설정되는 host(미요청 시 null)를 구분합니다. 호스트 probe는 전용 RAM에서 임시 CPU를 초기화할 뿐이며 임의의 워크로드 호환성을 증명하지 않습니다. 사용 가능성은 변할 수 있고 미지원 백엔드로 조용히 대체하지 않습니다. 유효한 보고서(백엔드 미사용 가능 포함)는 CLI 0, 잘못된 설정/질의는 1을 반환합니다.

SDK 및 C++ 경계

neverd_cpu_capabilities_json은 기존 세션, 선택적 설정 JSON, 값이 0 또는 1인 ProbeHost를 받으며 로드된 바이너리는 필요하지 않습니다. 결과는 neverd_free_string으로 해제하고, NULL이면 neverd_last_error를 확인합니다. CPU 비활성화 빌드도 동일 함수를 내보내고 비활성 상태를 명시합니다. Python 플러그인은 session.cpu_capabilities(...)를 사용합니다. C++은 executionCapabilities, resolveExecutionConfiguration, queryExecutionBackendBuild, probeExecutionBackend를 분리해 사용할 수 있습니다. createExecutionBackend는 기존 공간에 CPU를 연결하거나 전용 RAM과 기본 공간을 생성합니다.

CPU 결과와 예산

CPU.runUntilExit(PC, TimeoutMicroseconds)는 형식화된 ExecutionExit를 반환합니다. 실행 전 설정 오류는 llvm::Error이고 실행이 시작되면 중지, deadline, 서비스 요청, 복구 가능한 fault, 게스트 fault/trap, 미지원 연산, 장치/백엔드 오류, 설명되지 않은 엔진 중지를 명시합니다. CPU/장치/백엔드 fault는 동시 중지/deadline보다 우선하며 독립 사실과 세부 정보를 보존합니다. 타임아웃은 양수이고 기간 및 절대 deadline으로 표현 가능해야 합니다. 아니면 CPU 상태를 바꾸기 전에 실패합니다. 모든 실행에는 유한 예산이 필요하며 0은 무제한도 유효한 즉시 timeout도 아닙니다. 제어는 협력적이며 hard wall-clock 제한이 아닙니다. 결과가 복구 가능한 fault를 소비하지 않습니다. OS 소유자가 fault를 가져와 검증된 예외 전송을 설정한 뒤 재개해야 합니다. 기존 run, fault, timedOut은 유지되지만 run만 재정의한 외부 CPU 구현은 새 형식 경계를 거부합니다.

서비스 요청

checked user x64는 접두사 없는 정확한 SYSCALL 인코딩만 가로채고 checked user ARM64는 SVC #imm16을 가로챕니다. SYSENTER, INT, HVC, BRK 및 다른 메커니즘은 미지원입니다. 명령 관찰자가 먼저 실행됩니다. 중지나 fault가 없으면 CPU는 명령 실행이나 백엔드 진입 전에 ExecutionExitKind::ServiceRequest를 반환하고 종류, 원래 PC, 순차 NextPC, SVC immediate를 제공합니다. 레지스터, 플래그, 스택, 권한은 바뀌지 않습니다. x64 RCX/R11 SYSCALL clobber와 ARM64 예외 벡터 진입도 아직 발생하지 않습니다. SVC immediate는 범용 서비스 번호가 아닙니다.

요청이 보류된 동안 실행, CPU 변경, 주소 공간 연결, 컨텍스트 저장/복원을 막습니다. CPU가 정지한 상태에서 OS 소유자가 takeServiceRequest()로 정확히 한 번 가져갑니다. OS 소유자는 ABI 해석, 서비스 처리, 결과 레지스터 및 다음 PC/예외 전송을 명시적으로 수행해야 합니다. 미지원 서비스는 이 경계에서 실패합니다. 원래 PC를 다시 실행하면 새 요청이 생성되며 NOP나 성공 결과를 암묵적으로 만들지 않습니다. 서비스 이벤트는 동시 중지/deadline보다 우선하지만 게스트/백엔드 오류는 더 높은 우선순위입니다. CPU 중지, 소프트웨어 HLT, deadline, trap은 워크로드 성공을 뜻하지 않습니다. 별도의 Linux 프로세스 프로필은 OS 서비스를 직접 모델링하며 Windows, Android, Darwin 동작을 입증하지 않습니다. Windows 및 ARM64 native 실행은 실기 런타임 검증이 필요합니다.

x64 확장과 네이티브 CPU 상태

마스킹된 x64 명령 설명은 이식 가능한 기준입니다. KVM/WHP는 driver-strict, checked-x64-v1, checked-user-x64-v1에 precise_simd_exceptions를 추가합니다. 네이티브 시작 검증이 정확한 #XM과 두 재시도를 확인한 뒤에만 마스크 해제 MXCSR 쓰기, LDMXCSR, Windows CONTEXT 복원을 허용합니다. ExecutionProfiles.def가 선택을 관리하고 supportsSIMDExceptions가 결정된 인스턴스 기능을 제공합니다. checked Unicorn은 계속 마스크를 요구하며 ARM64 및 HVF의 예외 기능은 확장하지 않습니다.

네이티브 x64 KVM/WHP는 실제 #XM을 X64SIMDException을 통해 드라이버 C SEH로 전달합니다. 하드웨어 오류의 CONTEXT는 XMM0–15와 MXCSR를 보존합니다. 필터, 예외 언와인드 finally 콜백과 선택된 핸들러는 MXCSR 0x1f80, DF 해제 상태에서 실행됩니다. 음수 필터는 XMM과 최상위 CONTEXT.MxCsr를 수정한 후 원래 명령을 재시도할 수 있습니다. 후자에는 게스트 CPU 마스크가 적용되며 FltSave.MxCsr는 커널 복원을 제어하지 않습니다. 모델 API 예외는 정수/제어 레코드를 유지하며 x87/AVX 컨텍스트 수정은 계속 거부됩니다.

checked x64는 제한된 legacy SSE/SSE2 이동·논리 연산, MOVLHPS/MOVHLPS, 마스크형 scalar CVTTSS2SI/CVTTSD2SI/SUBSS/SUBSD를 허용합니다. MXCSR는 누적 상태, 반올림, FTZ를 보존하며 이식 가능한 실행은 마스크되지 않은 예외를 거부합니다. KVM/WHP는 16개 XMM 레지스터 전체와 MXCSR를 동기화합니다. 목록에 없는 인코딩과 operand 조합은 허용되지 않습니다.

checked x64는 마스크된 legacy ADD, SUB, MUL, DIV, SQRT, MIN, MAX의 SS, SD, PS, PD 형식도 허용합니다. X64SSEInstructions.def가 operand 너비, 정렬, 허용 규칙을 관리합니다. MaskedSSEArithmeticMatchesIndependentHostExecution은 독립 host CPU oracle로 register/RAM 형식, 네 반올림 모드, FTZ, signed zero, subnormal, NaN을 검증하며, SSEMemoryObserverStopsBeforeResultAndStatusChanges는 효과 반영 전 중단을 검증합니다. x87, AVX는 허용하지 않습니다.

이식 가능한 소프트웨어 프로필에서 Unicorn은 기존 MINSS/MINSD/MINPS/MINPD와 MAXSS/MAXSD/MAXPS/MAXPD가 선택한 값에 DAZ를 적용합니다. 선택한 비정규 입력은 부호 있는 0이 되며 NaN 페이로드와 기존 MXCSR 상태는 보존됩니다. test_x86_sse_minmax_daz는 레지스터, RAM, 동일 레지스터 형식에서 DAZ 켜기/끄기, 모든 반올림 모드, FTZ 및 누적 상태를 검사합니다.

KVM/WHP는 비공개 FXSAVE64 실행으로 MXCSR_MASK를 탐색하고 부호 있는 비정규 입력의 산술로 DAZ 기능을 검증합니다. checked Unicorn은 소프트웨어 마스크를 제공합니다. supportedControlBits는 CPU의 불변 마스크를 반환하며 FX/XSAVE, 스냅샷, Windows CONTEXT가 이를 공유합니다. checked LDMXCSR/STMXCSR는 정확히 m32의 전체 RAM 권한을 검사하고 오류나 관찰 콜백 취소 시 상태를 보존합니다. 예약 비트 로드는 #GP를 발생시키며 이식 가능한 실행은 마스크되지 않은 SIMD 예외를 거부합니다. X64MXCSRTests.cpp는 제어와 재시도를 검사하고 X64DAZData는 허용된 SSE 산술 28종을 원본 호스트 명령과 비교하여 DAZ, 반올림, FTZ를 검증합니다. HVF의 DAZ 지원은 확장하지 않습니다.

네이티브 x64 시작 검증은 전송 계층의 콜드 스타트 준비와 모든 탐색 단계에 하나의 5 s 예산을 사용합니다. 게스트 실행 예산은 독립적입니다. 초기화 중단은 명령 단계, stop_requested, deadline_reached를 보고하며 중단 타입과 원래 전송 진단을 유지합니다. 재시도하거나 검증이 끝나지 않은 CPU를 허용하지 않습니다.

PAUSE(F3 90)는 네이티브 driver-strict를 포함하여 KVM/WHP와 checked Unicorn의 공통 x64 머신 경계를 통해 실행됩니다. X64PauseTests.cpp는 전체 상태 보존, 실행 전 중지, 컨텍스트 복원, 잘못된 LOCK 거부, 스핀 루프의 시간 제한과 재개를 검증합니다. 이 프로세서 힌트는 게스트 스레드를 스케줄링하거나 특정 지연을 보장하지 않습니다.

PUSHFQ(9C)와 16비트 PUSHF(66 9C)는 driver-strict를 포함한 네이티브 KVM/WHP 및 checked Unicorn에서 실행됩니다. 공유 ISA 계층은 RAM 트랜잭션을 커밋하기 전에 스택 이미지에서 내부 단일 단계 실행용 TF를 제거합니다. 암시적 스택 주소에는 전체 RSP를 사용하며 접두사 순서가 피연산자 너비를 결정합니다. 전체 범위 권한 검사, 관찰자 중지, 오류 재시도는 원자성을 유지합니다. X64PushFlagsTests.cpp는 허용된 플래그 조합 256개와 인코딩 9개, 페이지 경계를 넘는 별칭, 사용자 권한, 취소 및 컨텍스트 복원을 검사합니다.

POPFQ(9D)와 16비트 POPF(66 9D)는 공유 x64 ISA 계층에서 플래그를 복원하며 KVM, WHP, checked Unicorn 및 driver-strict에 적용됩니다. 프로파일의 IOPL은 0으로 고정되므로 CPL0은 IF를 바꿀 수 있고 CPL3은 IF와 IOPL을 유지합니다. 예약 비트와 VM/VIF/VIP는 무시하며 RF는 지웁니다. 게스트 TF, NT, AC, ID 또는 CPL0 IOPL의 유효한 변경은 아직 지원하지 않으며 상태 공개 전에 명시적으로 실패합니다. 전체 스택을 읽은 뒤 FLAGS/RSP/RIP를 원자적으로 갱신하고, 전체 RSP와 유효한 접두사 순서로 피연산자를 결정합니다. 스택은 읽기 전용이거나 실행 메모리의 별칭일 수 있습니다. 공유 계층에서 완료하므로 전송 계층의 내부 TF가 지워지지 않습니다. X64PopFlagsTests.cpp는 독립적인 네이티브 CPL3 명령 비교와 모든 입력 비트, 오류, 관찰자, 후속 네이티브 실행을 검사합니다.

checked x64는 CLC/STC/CMC와 LAHF/SAHF를 허용합니다. 캐리 명령은 전송 계층에서 실행하고 AH 전송은 KVM, WHP, checked Unicorn 및 네이티브 driver-strict에서 하나의 ISA 구현을 공유합니다. LAHF는 다섯 상태 플래그와 고정 비트를 AH에 쓰며 SAHF는 CF/PF/AF/ZF/SF만 변경합니다. OF/IF/DF와 다른 레지스터는 유지됩니다. 모든 REX 값을 포함해 무시되는 접두사도 암시적 AH를 사용합니다. X64StatusFlagsTests.cpp는 원본 호스트 명령, 전체 상태, 취소와 재개를 검사합니다. 고정 버전 Unicorn 변환기도 이식 가능한 프로필에서 REX가 붙은 암시적 AH를 유지하고, 다섯 명령의 LOCK 형식을 상태 변경 전에 거부합니다.

checked x64는 KVM, WHP, Unicorn에서 16/32/64비트 대상과 imm8/CL 횟수를 사용하는 SHLD/SHRD를 실행합니다. 횟수에 아키텍처 마스크를 적용하고, 16비트 형식에서 16을 넘는 미정의 횟수는 효과 전에 거부합니다. RAM은 정확한 폭으로 읽기·쓰기를 검사하며 기존 트랜잭션에서 공개 전에 결과를 관찰합니다. 취소하면 CPU와 메모리를 되돌립니다. LOCK과 장치 피연산자는 지원하지 않습니다.

X64ScalarShiftInstructions.def는 SHL/SHR/SAR, ROL/ROR, RCL/RCR의 8/16/32/64비트 대상 효과를 정의합니다. 레지스터 및 RAM 형식은 암시적 1, imm8, CL 횟수를 지원하며 마스킹 후 0인 횟수와 SAL 별칭도 포함합니다. RAM 쓰기는 권한 검사, 결과 관찰 콜백, 공유 트랜잭션을 거칩니다. 중지 또는 콜백 오류가 발생하면 CPU와 메모리를 복원합니다. KVM, WHP, Unicorn 검사 모드는 이 경계를 공유합니다. LOCK 및 MMIO 형식은 아직 지원하지 않습니다.

X64LoopInstructions.def는 프로세서 실행 경로에서 LOOP/LOOPE/LOOPNE를 허용합니다. 주소 크기는 RCX 또는 0으로 확장되는 ECX를 선택하며 FLAGS는 유지됩니다. 대상 너비는 CPU 모델을 따릅니다. 긴 모드의 Intel은 66H를 무시하고 AMD는 16비트 재정의를 유지하며 REX.W가 우선합니다. 네이티브 KVM/WHP는 호스트 CPU를, Unicorn은 기본 Intel Haswell 모델을 사용합니다. 공유 허용 규칙은 디코더가 생략한 경우에도 LOCK과 REP를 부작용 전에 거부합니다.

X64BranchModel은 상대 JMP/Jcc 디코딩을 실행과 일치시킵니다. 네이티브 KVM/WHP는 시간 제한이 있는 초기화에서 실행되지 않는 66H 분기와 REX.W 우선순위를 측정합니다. 검사 모드 Unicorn은 Intel 모델을 사용합니다. 불변 결과는 명령 관찰자와 Windows 드라이버 정책의 디코더를 함께 선택합니다. 긴 모드에서 Intel은 근거리 분기의 rel32와 전체 대상 폭을 유지하고 AMD는 16비트 재정의를 따릅니다. 명령 바이트가 불완전하면 관찰자나 CPU 진입 전에 실패합니다.

X64StackInstructions.def는 KVM, WHP, 검사 모드 Unicorn(driver-strict 포함)에서 범용 레지스터와 일반 RAM을 사용하는 16/64비트 PUSH/POP 및 즉시 값 PUSH을 허용합니다. PUSH는 RSP 감소 전에 소스를 읽고 POP은 RSP 증가 후 RSP/ESP 기반 목적지를 계산합니다. 주소 폭 잘림은 명시적 피연산자에만 적용됩니다. 전체 범위 권한 검사, 순서 있는 관찰 및 단일 RAM 트랜잭션은 오류, 취소, 콜백 실패 시 CPU와 메모리의 부분 갱신을 막습니다. LOCK 및 장치 피연산자는 지원하지 않습니다.

KVM, WHP, checked Unicorn은 16/64비트 LEAVE도 지원합니다. 67H가 있어도 RBP 전체로 저장된 프레임을 읽고, 16비트 형식에서는 선택되지 않은 RBP 비트를 유지합니다. 폴트나 읽기 취소 시 원래 RSP와 CPU 컨텍스트를 유지합니다. LOCK, REP, 장치 프레임은 지원하지 않습니다.

KVM, WHP 및 checked Unicorn은 16/64비트 ENTER를 지원합니다. 할당량은 부호 없는 16비트로, 중첩 수준은 32로 나눈 나머지로 해석하며 전체 RSP/RBP와 유효한 접두사 순서를 사용합니다. 게스트 오류 시 완료된 스택 저장은 유지되고 RSP, RBP, PC는 진입 값을 유지합니다. 마지막 스택 검사는 피연산자 폭 전체의 쓰기 권한만 확인하며 데이터를 저장하지 않습니다. LOCK, REP, APX 접두사와 장치 프레임은 지원하지 않습니다.

검사 x64는 2바이트 근거리 복귀 F3 C3을 허용합니다. 컴파일러는 분기 대상이 되는 복귀 앞에 반복 접두사를 넣고 프로세서는 이를 무시하므로, 이 명령은 이미 허용된 C3 전이와 같고 스택 읽기도 동일합니다. F2 C3, 두 번째 접두사, 피연산자 크기 재정의, F3 C2 iw를 포함한 그 밖의 접두사 붙은 복귀는 여전히 계약 밖에 있습니다. X64ReturnPrefixTests.cpp는 KVM, WHP, 검사 Unicorn을 검사합니다.

X64PackedIntegerInstructions.def는 순환·포화 덧셈과 뺄셈, 비교, 곱셈, 평균, 최솟값·최댓값, 바이트 차이, 패킹·언패킹을 포함한 45개 legacy SSE2 packed integer 명령을 허용합니다. XMM과 정렬된 128비트 RAM 소스는 KVM, WHP, Unicorn의 기존 checked 경로를 공유합니다. FLAGS와 MXCSR은 변하지 않으며 결함이나 관찰자 취소 시 상태를 보존합니다. MMX, VEX/EVEX, 장치 피연산자는 제외됩니다.

X64PackedShiftInstructions.def는 legacy SSE2 패킹 시프트 열 종류를 허용합니다. 요소 시프트의 횟수는 imm8 또는 XMM/정렬된 m128이며 바이트 시프트는 imm8만 허용합니다. 가변 횟수는 부호 없는 하위 64비트를 사용하고 스칼라 횟수 마스킹을 하지 않으며 상위 64비트는 무시합니다. 횟수가 0이거나 범위를 넘어도 메모리 피연산자는 16바이트 전체를 읽어야 합니다. FLAGS와 MXCSR은 유지되며 MMX, VEX/EVEX, 장치 피연산자는 제외됩니다.

X64VectorOperands.def는 기존 SSE 이동, 연산, 시프트, 변환 및 마스크의 전체 피연산자 규칙을 정의합니다. MOVMSKPS, MOVMSKPD, PMOVMSKB는 XMM의 부호 비트를 r32/r64로 추출하고 대상의 나머지 비트를 0으로 만듭니다. KVM, WHP, checked Unicorn은 같은 허용 규칙을 사용하며 FLAGS, MXCSR 및 원본 레지스터를 보존합니다. 마스크의 메모리 피연산자, MMX 및 VEX/EVEX 형식은 지원하지 않습니다.

X64ShuffleInstructions.def는 PSHUFD, PSHUFHW, PSHUFLW, SHUFPS, SHUFPD를 추가합니다. X64VectorOperands.def는 XMM 대상, XMM 또는 정렬된 m128 원본, imm8의 완전한 세 피연산자 형식을 요구합니다. 원래 명령은 FLAGS와 MXCSR을 유지하며 비트 그대로 레인을 선택합니다. 메모리 형식은 16바이트 전체를 검사하고 정렬 오류는 데이터 관찰보다 먼저 발생합니다. KVM, WHP, checked Unicorn은 이 규칙을 공유합니다. 같은 목록은 피연산자가 정확히 두 개인 UNPCKLPS, UNPCKHPS, UNPCKLPD, UNPCKHPD도 허용하여 원래 대상과 원본의 비트 패턴을 교차 배치합니다. 하드웨어는 선택한 64비트만 가져올 수 있으며 checked RAM은 정렬된 m128 피연산자를 검사합니다.

MOVLPS, MOVHPS, MOVLPD, MOVHPD는 정렬 요구 없이 RAM의 정확히 8바이트를 전송합니다. X64VectorInstructions.def는 저장할 절반을 선언하고 X64VectorOperands.def는 XMM/m64 쌍을 요구합니다. 로드는 나머지 64비트를 보존하며 상위 절반 저장 관찰자는 상위 데이터를 받습니다. KVM, WHP, checked Unicorn은 전체 범위 권한 검사와 RAM 롤백을 공유합니다. 레지스터 전용 MOVHLPS/MOVLHPS는 고유 의미를 유지합니다.

CVTSI2SS와 CVTSI2SD는 MXCSR 반올림 규칙으로 부호 있는 32/64비트 정수를 변환하며 정밀도 상태를 유지합니다. 공유 IntegerSource 규칙은 XMM 목적지와 r32/r64 또는 m32/m64 소스만 허용합니다. 기존 형식은 목적지 상위 96/64비트를 보존하고 메모리 검사에는 정수 너비를 사용합니다. KVM, WHP, checked Unicorn은 원래 명령을 실행합니다. MMX, VEX/EVEX는 제외됩니다.

CVTSS2SI와 CVTSD2SI는 공유 IntegerResult 규칙에서 MXCSR 반올림에 따라 부호 있는 32/64비트 정수를 생성하고, CVTTSS2SI와 CVTTSD2SI는 항상 0 방향으로 버립니다. 예외가 마스크된 NaN·범위 초과 변환은 정수 부정값을 반환하고 무효 상태를 설정하며, 유효하지만 부정확한 결과는 정밀도 상태를 설정합니다. 기존 누적 상태, FLAGS, XMM 소스는 보존됩니다. r32 결과는 범용 레지스터 상위 절반을 지웁니다. RAM 읽기는 목적지 너비와 관계없이 부동소수점 소스 너비를 사용하며 FTZ는 비정규 입력을 버리지 않습니다. KVM, WHP, checked Unicorn에 공통으로 적용됩니다.

COMISS, COMISD, UCOMISS, UCOMISD는 공유 Source 규칙으로 스칼라 XMM 또는 m32/m64를 비교합니다. CF/PF/ZF를 설정하고 OF/SF/AF를 지우며 다른 FLAGS와 소스 레인을 보존합니다. COMIS는 모든 NaN에, UCOMIS는 signaling NaN에만 무효 상태를 설정하며 NaN 처리가 비정규 상태보다 우선합니다. MXCSR 누적 비트는 보존되고 반올림과 FTZ는 비교에 영향을 주지 않습니다. KVM, WHP, checked Unicorn은 정확한 메모리 검사를 공유합니다. 고정된 Unicorn 비교 함수는 기존 비정규 입력 분류를 재사용합니다.

CMPSS, CMPSD, CMPPS, CMPPD는 KVM, WHP, checked Unicorn에서 기존 8개 비교 조건을 실행합니다. 공유 Source 규칙은 디코딩된 별칭을 허용하고 예약 제어값은 거부합니다. 스칼라 형식은 상위 레인을 보존하고 m32/m64를 읽으며 벡터 형식은 정렬된 m128을 요구합니다. FLAGS와 기존 MXCSR 상태를 보존하고 활성 레인별 무효·비정규 상태를 누적합니다. Capstone이 명령 계열 ID와 SSE 조건을 소유하여 lifter 내부의 ID 보정을 대체합니다. Unicorn은 각 비교 함수에서 비정규 입력을 분류합니다.

CVTSS2SD, CVTSD2SS, CVTPS2PD, CVTPD2PS는 공유 Source 규칙으로 기존 SSE 정밀도를 변환합니다. 스칼라 결과는 대상 상위 64/96비트를 보존합니다. 패킹 확장은 m64를 읽어 배정밀도 두 개를 쓰고, 축소는 정렬된 m128을 읽어 단정밀도 두 개를 쓰며 상위 64비트를 지웁니다. KVM, WHP, checked Unicorn의 원본 명령 실행은 FLAGS를 보존하고 반올림 및 FTZ 제어에 따라 마스크된 MXCSR 상태를 누적합니다. Unicorn은 변환 함수에서 활성 비정규 입력을 각각 분류합니다. VEX/EVEX는 제외됩니다.

CVTDQ2PS와 CVTDQ2PD는 공유 Source 규칙으로 부호 있는 32비트 정수를 패킹 변환합니다. 단정밀도는 정렬된 m128과 MXCSR 반올림을 사용하고, 배정밀도는 비정렬도 허용하는 m64를 읽어 정확히 변환합니다. 대상 XMM 전체를 교체하고 FLAGS와 기존 MXCSR 상태를 보존하며 부정확한 단정밀도 결과는 정밀도 상태를 누적합니다. KVM, WHP, checked Unicorn은 원본 명령을 실행합니다. Unicorn은 두 패킹 확장 함수를 식별해 8바이트 읽기를 선택합니다. MMX, VEX/EVEX는 제외됩니다.

CVTPS2DQ와 CVTPD2DQ는 MXCSR 반올림을 사용하며 CVTTPS2DQ와 CVTTPD2DQ는 0 방향으로 절삭합니다. 공유 Source 규칙은 정렬된 m128 또는 XMM 입력을 요구합니다. NaN이나 범위 밖 레인은 signed32 indefinite와 무효 상태를 생성하고 다른 유효한 비정확 레인은 독립적으로 정밀도 상태를 누적합니다. 단정밀도 입력은 정수 네 개를, 배정밀도 입력은 두 개를 생성하고 대상 상위 64비트를 지웁니다. FLAGS와 기존 MXCSR 상태를 보존하며 FTZ는 비정규 입력을 버리지 않습니다. KVM, WHP, checked Unicorn은 원본 명령을 실행합니다. MMX, VEX/EVEX는 제외됩니다.

X64AlignmentTests.cpp는 허용된 aligned SSE 명령의 비정렬 피연산자가 데이터 관찰자, 권한 검사 또는 장치 콜백 전에 복구 가능하거나 종료되는 #GP(0)를 보고하는지 검증합니다. 오류는 공개 x64 레지스터 전체, PC와 RAM을 보존합니다. 주소 폭에 따른 순환 후 FS/GS 기준 주소를 더하고, 주소를 고치면 원래 명령을 재시도합니다. 직접 KVM/WHP 머신 테스트가 하드웨어 경계를 독립적으로 검증합니다. Windows ring3는 분류된 operand_alignment 오류를 전달하며, 다른 원인의 #GP는 아직 지원하지 않습니다.

thread pointer는 x64 FS/GS base와 ARM64 TPIDR_EL0의 정확한 MRS/MSR 인코딩을 포함합니다. 네이티브 전송 계층과 CPU snapshot은 메모리와 독립적으로 상태를 보존하지만 OS 스레드나 TLS 블록을 만들지는 않습니다. supervisor x64는 1/2/4바이트 정렬 scalar MMIO와 재시작 경계마다 MOVS 한 요소를 지원합니다. 장치 읽기는 부작용 없는 준비 preview 후 최대 한 번 commit해야 합니다. user 프로필은 장치 매핑을 거부하며 RMW, 넓은 MMIO, 포트 I/O도 계속 미지원입니다.

KVM/WHP는 활성 네이티브 진입을 취소하고 실행 자원을 회수하기 전에 취소 완료를 확인합니다. KVM은 전용 실행 스레드와 일시적으로 차단 해제하는 realtime signal을 사용하며 진입 중 해당 signal을 무시 상태로 두면 안 됩니다. 호출자의 signal mask/handler는 바꾸지 않습니다. 게스트 진행 상태가 불확실한 취소는 terminal failure이고 엄격한 wall-clock deadline은 보장하지 않습니다.

x64 네이티브 동기 예외

checked x64의 DIV/IDIV는 실제 프로세서 결과와 #DE를 사용합니다. KVM은 비공개 supervisor IDT/IST, WHP는 명시적인 예외 비트맵을 사용하며 원래 컨텍스트와 제공된 오류 코드를 전송 오류와 구분합니다. OS는 복구 가능한 이벤트를 소비한 뒤 계속 실행할 컨텍스트를 설치합니다. Windows 드라이버는 0으로 나누기와 몫 오버플로를 STATUS_INTEGER_DIVIDE_BY_ZERO로 변환하고 실제 SEH filter, __finally, 재시도를 실행합니다. NeverDX64ExceptionTests는 Unicorn 없이 빌드되며 DriverWDMCPUException은 원본 WDK 사례를 검증합니다. 사용할 수 없는 ARM64 호스트는 명시적으로 건너뜁니다.

단계적으로 보관하는 RAM 효과

RAMTransaction은 물리 실행 임대 아래에서 명령이 선언한 쓰기 범위의 물리적 합집합만 보관합니다. 결과 관찰자 호출 전에 원래 RAM을 복원하며 취소, 전송 오류, 관찰자 예외는 부분 RAM이나 레지스터를 공개하지 않습니다. CPU 예외는 RAM 복원 후에도 아키텍처 예외 상태를 유지합니다. ARM64 단일·쌍 저장도 같은 계층을 사용합니다. x64는 8/16/32/64비트 XCHG, XADD, CMPXCHG를 실행하며 LOCK 또는 암시적 잠금 형식에는 자연 정렬을 요구합니다. NeverDRAMTransactionTests는 호스트 CPU와의 결과 비교, 복원, 별칭, 권한을 검증하며 사용할 수 없는 플랫폼은 명시적으로 건너뜁니다. 장치 원자 연산은 별도 제공자를 사용하며 CPU 스냅샷은 이미 확정된 RAM을 복원하지 않습니다.

CMPXCHG8B와 CMPXCHG16B는 KVM, WHP 및 checked Unicorn의 드라이버·사용자 프로필에서 원래 명령을 실행합니다. 비교 성공 여부와 관계없이 읽기와 쓰기 권한이 모두 필요하며, 폴트는 쓰기 접근으로 분류합니다. CMPXCHG16B는 메모리 접근 전에 16바이트 정렬을 검사하고 위반 시 #GP(0)을 보고합니다. 두 결과 콜백은 하나의 RAM 트랜잭션에 속하므로 어느 쪽에서든 중지하거나 예외가 발생하면 레지스터와 RAM 변경을 공개하지 않습니다. 잠금 없는 CMPXCHG8B는 페이지 경계를 넘을 수 있지만 잠금 연산은 자연 정렬이 필요합니다. X64WideAtomicTests.cpp는 호스트 원본 명령 결과와 네이티브 폴트, 별칭, 접두사, 주소 계산, 복구 후 재시도와 취소를 검증합니다. 자체 Windows 드라이버와 ring3 PE 픽스처가 두 폭을 실행하며 WDK 픽스처는 _InterlockedCompareExchange128도 실행합니다. CPU 모델은 CMPXCHG16B를 지원해야 합니다.

전체 x87 상태

NeverDEmulationArch는 ISA, 페이지 테이블과 FP 상태 배치를 소유하며 네이티브 및 Unicorn 전송이 공유합니다. x64 컨텍스트는 x87 제어, 상태, TOP, 물리 태그, 연산 코드, 명령/데이터 포인터와 8개의 80비트 레지스터를 보존합니다. FP0–FP7은 RegisterValue를 사용하고 스칼라 접근은 잘림을 거부합니다. FPTag는 물리 비어 있지 않음 비트맵입니다. NeverDX64FPTests는 모든 TOP, 정확한 연산의 호스트 FXSAVE/FXRSTOR 비교와 복원을 검사합니다. checked x87 명령 또는 모든 반올림 의미를 입증하지 않으며 없는 네이티브 호스트는 명시적으로 건너뜁니다.

driver-strict는 일치하는 Linux x64 host의 KVM과 Windows x64 host의 WHP를 지원합니다. auto는 해당 native transport를, cross-ISA는 Unicorn을 선택합니다. 명시적 Unicorn과 기존 V1 API는 portable software profile을 유지합니다. native 실행은 진입 전에 canonical address와 instruction effect를 검증하고, hardware가 없으면 fallback 없이 실패합니다. 지원되지 않는 instruction/OS behavior는 명시적 오류입니다. Windows x64 네이티브 CI는 Unicorn을 비활성화하고 필수 검사 359개를 모두 통과합니다. CPU 검사 131개, 내장 이미지 26개·WDK 이미지 46개·시나리오 사례 40개를 기본 및 재배치 주소에서 실행한 드라이버 결과 224개, SEH 경계 검사 4개를 포함합니다 (9d4c130c). native ARM64 실기 증거는 아직 없으며, 임의 driver나 Android/Darwin 호환성을 의미하지 않습니다.

executionCapabilities(Contract, ISA, Backend)로 선택한 백엔드의 기능을 조회합니다. NativeLegacyX64는 네이티브 x64 드라이버 실행을 나타내며, NeverDNativeDriverTests는 기존 드라이버 모음을 검증합니다. 이 테스트는 Unicorn을 비활성화한 빌드에서도 실행할 수 있습니다.

Checked ARM64는 하나의 완전한 상태 커밋 경계를 사용합니다. Registers.def가 39개 스칼라 필드와 32개 128비트 벡터를 정의하며 captureAArch64State는 모든 읽기, 선언된 폭과 NZCV 정규화를 완료한 뒤 한 번에 게시합니다. Unicorn/KVM/WHP/HVF는 TPIDR_EL0, TPIDRRO_EL0, TPIDR_EL1, FPCR, FPSR를 포함한 같은 상태를 전송합니다. 네이티브 어댑터는 CPACR_EL1로 FP/SIMD를 활성화합니다. 읽기 실패나 진입 취소 시 호출자의 전체 상태가 보존됩니다.

ARM64 KVM/WHP/HVF 초기화는 전용 AArch64MachineProbe.def 프로그램을 실행합니다. NOP, 양의 무한대 방향으로 반올림하는 FP32 덧셈, 두 레인의 SIMD 덧셈입니다. 각 단계에서 39개 스칼라 필드와 32개 벡터를 모두 비교하여 TLS, NZCV, 결과 상위 비트 초기화, FPCR/FPSR 보존 및 누적 상태를 확인합니다. 감독자 전용 모니터 메모리와 하나의 전체 마감 시간을 사용합니다. 이 검사는 제한된 초기화만 검증합니다. Linux ARM64 KVM과 Windows ARM64 WHP의 워크로드 검증은 아직 남아 있습니다. macOS 네이티브 결과는 HVF 가이드에 기록되어 있습니다. 이 프로그램에는 키가 비활성화된 A/B 반환 주소 서명 및 인증과 보호되지 않은 페이지의 네 가지 BTI 명령도 포함됩니다.

프로브는 MRS CTR_EL0를 두 번 실행하고 DC CVAU, DSB ISH, IC IVAU, ISB를 실행하여 캐시 구성의 안정성과 전체 상태를 확인합니다. Checked EL0/EL1은 원래 명령어, 이름이 있는 기본 DSB 옵션, ISB SY를 허용합니다. CTR은 선택한 가상 CPU에서 읽으며 전송 방식에 따라 다를 수 있습니다. 캐시 대상은 현재 권한으로 읽을 수 있는 일반 RAM이어야 하며 비정렬 주소와 별칭도 허용합니다. 다른 대상은 미지원으로 거부하고 캐시 유지 작업은 데이터 읽기/쓰기 관찰 이벤트를 만들지 않습니다. 투영은 명령 실행의 일관성을 유지하지만 개별 캐시 내용이나 병렬 하드웨어 SMP를 모델링하지 않습니다. NeverDAArch64CacheTests는 전체 상태, 읽기 전용 페이지 끝, 거부, 중지, 컨텍스트, 예산 및 페이지를 넘는 RW/RX 별칭을 통한 guest 코드 갱신을 검증합니다. 사용할 수 없는 KVM/WHP 호스트는 명시적으로 건너뜁니다.

x64 KVM/WHP/HVF 네이티브 초기화는 비공개 supervisor 페이지에서 X64MachineProbe.def를 실행합니다. 하나의 기한 안에 NOP, 양의 무한대 방향으로 반올림하는 FP32 덧셈, 두 레인 SIMD 덧셈, FS/GS 로드와 CS/SS/CR8 읽기를 수행하며 각 단계에서 전체 스칼라, XMM, 물리 x87 및 제어 상태를 비교합니다. x64와 ARM64 검사는 물리 메모리의 독점 실행 임대를 요구합니다. MemoryProjection은 캐시 식별 정보(ISA, 주소 공간, 매핑 세대, 권한, 모니터 구성)와 ISA별 확정된 페이지 테이블 루트 이력을 소유합니다. 비공개 바이트를 다시 쓰기 전에 캐시를 무효화하므로 실패한 재구축의 부분 테이블이나 호출자의 오래된 루트를 재사용할 수 없습니다. 이 검사는 제한된 초기화만 검증합니다. Linux ARM64 KVM과 Windows ARM64 WHP의 워크로드 검증은 아직 남아 있습니다. macOS 네이티브 결과는 HVF 가이드에 기록되어 있습니다.

공유 XSAVE 디코더는 표준 형식과 압축 형식의 SSE 초기 상태를 구분합니다. XSTATE_BV[1]이 0이면 두 형식 모두 XMM을 초기화하지만 표준 형식은 MXCSR을 읽고 검증하며 압축 형식은 MXCSR을 초기화합니다. X64XsaveCases.def는 독립적인 데이터 배치와 직접 작성한 호스트 XRSTOR 프로그램을 제공합니다. X64XsaveTests.cpp는 거부 시 상태의 원자성을 확인하고 호출자의 FP/SSE 상태를 보존하면서 두 형식을 실제 호스트 실행과 비교합니다. 호스트 아키텍처나 필요한 명령 기능을 사용할 수 없으면 명시적으로 건너뜁니다.

X64FPState.def는 압축 AVX, AVX-512, CET_U/CET_S, AMX 전송 배치와 구성 요소의 64바이트 정렬을 선언합니다. 존재하는 확장 데이터는 모두 0인 초기 상태여야 하며, 없는 구성 요소의 데이터와 정렬 패딩은 상태를 정의하지 않습니다. 배치 비트가 오프셋을 결정하고 알 수 없는 배치, 초기 상태가 아닌 데이터, 잘못된 길이는 공개 전에 실패합니다. CompactedOffsetsFollowLayoutRatherThanPresentBits, WideLayoutIgnoresAbsentComponentsAndAlignmentPadding, InitialCETComponentsDoNotHideFPState, InitialWideComponentsDoNotHideFPState가 872바이트와 10752바이트 WHP 패킷을 검증합니다. 이 전송 지원은 해당 확장 명령 실행을 허용하지 않습니다.

WhpXsaveRegisters.def는 이름이 있는 x87/SSE 제어 레지스터로 완전한 XSAVE 패킷을 보완합니다. 마지막 연산 코드와 명령/데이터 포인터를 명시적으로 쓰고 호스트에서 읽습니다. 패킷의 0 필드는 보완할 수 있지만, 0이 아닌 메타데이터 충돌이나 공통 제어값 불일치는 상태 공개 전에 실패합니다. NamedMetadataRestoresOmittedPacketFields는 전체 FP 데이터를 유지하면서 누락 필드를 검증합니다.

네이티브 FOP/FIP/FDP는 호스트 x87 저장·복원 규칙을 따릅니다. 마스크되지 않은 대기 예외가 없으면 AMD는 이 필드를 0으로 만들 수 있으며 스냅샷은 관측값을 유지합니다. X64MachineProbe.def와 정밀 NOP/컨텍스트 테스트는 일관된 대기 예외를 설정하여 모든 필드를 유효한 상태에서 차이를 숨기지 않고 비교합니다. 호스트 프로세스 FXRSTOR64/FXSAVE64 참조는 두 상태를 검사하며, 백엔드는 호스트 결과를 입력 메타데이터로 대체하지 않습니다.

공통 encodeX64XsaveState / decodeX64XsaveState 코덱은 표준·압축 FP/SSE 패킷, 물리 TOP 순환, 누락된 구성 요소의 초기 상태 및 원자적 검증을 소유합니다. WHP는 완전한 XSAVE API를 사용하며 WHvGetVirtualProcessorState / WHvSetVirtualProcessorState를 우선하고 이전 XSAVE API를 호환 경로로 사용합니다. 이전 개별 x87 레지스터 인터페이스는 완전한 패킷을 대체할 수 없습니다. 초기 상태가 아닌 확장 구성 요소, 잘못된 헤더·제어 값 및 잘린 캡처는 명시적으로 실패합니다. WHP 매핑 실패는 진단을 위해 HRESULT, GPA 및 크기를 보존합니다.

CheckedX64Instructions.def는 기존 CPU 백엔드에서 8/16/32/64비트 부호 없는 MUL과 CBW/CWDE/CDQE/CWD/CDQ/CQO를 허용합니다. NeverDX64IntegerTests는 독립적인 X64IntegerCases.def 인코딩과 예상값을 사용하여 두 권한 수준에서 부분 레지스터 보존, 32비트 제로 확장, 곱의 상위·하위 결과, 정의된 CF/OF 및 부호 확장 시 플래그 보존을 검증합니다. 일반 RAM 곱셈은 전체 접근 범위의 권한 검사와 읽기 관찰 콜백을 유지하며, 오류나 관찰 콜백의 중지는 암시적 출력 레지스터와 PC를 보존합니다. 장치 피연산자는 지원하지 않습니다. checked Unicorn에서도 실행하며 사용할 수 없는 네이티브 백엔드는 명시적으로 건너뜁니다.

X64BitInstructions.def는 16/32/64비트 레지스터 및 일반 RAM의 BT/BTS/BTR/BTC를 허용합니다. 레지스터 비트 인덱스는 피연산자 너비의 부호 있는 값으로 전체 워드를 선택하며, 즉시값은 기준 워드 안에 머뭅니다. 주소 너비에 따른 절단은 FS/GS 기준 주소를 더하기 전에 적용됩니다. 프로세서가 CF와 쓰기 값을 제공하고, RAMTransaction은 관찰 콜백이 수락할 때까지 결과를 비공개로 유지합니다. 전체 범위 권한 검사는 독립 페이지 할당과 별칭을 포함하며, 중지·콜백 실패·페이지 접근 거부 시 원래 CPU와 RAM을 보존합니다. LOCK은 자연 정렬을 요구하며 수정 MMIO는 명시적인 준비형 원자 연산 제공자가 필요합니다. X64BitStringTests.cpp는 독립 인코딩을 실제 x64 호스트 실행과 비교하고 음수 인덱스, 너비 절단, 페이지 경계 접근, 취소, 잘못된 LOCK 형식을 검사합니다. Intel 명령어 참조를 참고하세요.

X64StringInstructions.def는 일반 RAM의 8/16/32/64비트 MOVS/STOS/LODS를 관리하며, CLD/STD는 다른 플래그를 보존하면서 방향만 바꿉니다. REP의 각 요소는 관찰 전에 전체 피연산자를 검사하고 재개 경계에서 확정됩니다. 후속 오류가 발생해도 완료한 요소는 유지되며, 중지나 콜백 예외는 현재 요소를 변경하지 않습니다. FS/GS는 주소 폭을 자른 뒤 소스에만 더합니다. AL/AX 로드는 상위 비트를 보존하고 EAX 로드는 0으로 확장합니다. 32비트 주소 모드에서 반복 횟수가 0이면 카운터 상위 비트가 0이어야 하며 MOVS/STOS의 참여 주소 레지스터도 동일합니다. 그렇지 않으면 실제 CPU 구현마다 결과가 다릅니다. MOVS/STOS/LODS의 REPNE 형식과 STOS/LODS 장치 피연산자는 아직 지원하지 않습니다. X64StringTransferTests.cpp는 독립적인 호스트 명령으로 폭, 방향, 중첩, 0회 반복을 비교하고 권한, 별칭, 주소 순환, 오류와 재개도 검사합니다. 자체 WDK 리소스 드라이버는 driver_resource_strings.def로 STOS/LODS의 네 폭을 모두 실행합니다.

X64StringInstructions.def는 일반 RAM의 8/16/32/64비트 CMPS/SCAS와 REPE/REPNE도 관리합니다. 각 요소는 관찰 전에 전체 읽기 범위를 검사하고 여섯 산술 플래그를 갱신하며 첫 종료 조건에서 멈춥니다. 데이터 오류는 이번 연속 REP 시작 시점의 플래그를 복원하면서 완료된 포인터와 카운터 변경을 유지합니다. 공개 API로 재개하면 게시된 CPU 상태에서 다시 시작합니다. 중지와 관찰 예외는 현재 요소를 변경하지 않으며 조기 종료 후 다음 요소를 읽지 않습니다. FS/GS는 CMPS 소스에만 적용되고 SCAS는 누산기와 사용하지 않는 소스 레지스터를 유지합니다. 장치 피연산자와 모호한 32비트 0회 반복 상위 비트는 제외됩니다. X64StringComparisonTests.cpp는 독립 호스트 명령으로 플래그, 방향, 별칭, 주소 순환, 권한과 복구를 비교하고 Linux x64 신호로 실제 오류 시점의 레지스터를 검사합니다. 자체 WDK 리소스 드라이버는 driver_resource_strings.def로 네 폭의 두 조건 반복 형식을 실행합니다. Intel 명령 참조를 참고하세요. Linux 네이티브 검증은 첫 요소 실행 전후의 오류를 검사하며, Intel의 진입 flags 복원과 Hyper-V의 AMD EPYC 7763에서 관측한 마지막 비교 flags 유지를 구분합니다(네이티브 관측). 알 수 없는 CPU 제조사는 명시적으로 실패합니다. checked 게스트는 모든 백엔드에서 진입 flags를 복원합니다.

활성 WHP CPU는 하나의 네이티브 파티션을 공유하며 마지막 해제와 재생성은 같은 레지스트리 잠금으로 직렬화합니다. WhpResourceCache.h는 협력 실행용 VP 0을 재사용하며 논리 CPU를 전환하기 전에 해당 VP와 매핑을 해제합니다. 병렬 CPU는 별도의 VP와 전용 GPA 영역을 유지합니다. 레지스터 전송, XSAVE 및 취소는 각각의 VP를 대상으로 합니다. x64는 호스트의 기본 XSAVE 기능 집합을 유지하고 WHvGetPartitionProperty로 실제 구성을 검증합니다. 기본 스케줄링은 협력 방식입니다.

CheckedBackend는 CPU마다 명령어 인출 버퍼와 cs_disasm_iter 명령어 레코드를 유지합니다. 매 단계 실행 권한이 있는 바이트를 다시 읽고 디코딩하며, 코드 쓰기·별칭 변경·실행 재개 뒤에 이전 디코딩 결과를 재사용하지 않습니다. 실행 임대는 재사용 저장소에 접근하기 전에 재귀 실행을 거부합니다. 명령어마다 이루어지는 버퍼와 레코드 할당을 제거하면서 명령어 관찰, 시스템 서비스 가로채기, 정확한 오류 처리를 유지합니다. 고정 버전 Unicorn의 단일 단계는 간접 변환 조회를 포함해 후속 명령어 인출 전에 끝나며 내부 코드 쓰기 재시도를 완료된 명령어로 세지 않습니다.

WhpX64Processor.h는 가상 프로세서별로 x64 WHP 레지스터 재사용을 관리합니다. 고정 패킷은 WhpX64Registers.def와 X64HostRegisters.def를 사용하며, 성공한 매 스텝에서 일반·제어·세그먼트 레지스터와 전체 FP/SSE 상태를 캡처합니다. 완료가 확인된 디버그 종료만 변경 없는 입력의 생략을 허용하며, 비교 시 예약 비트와 공용체 패딩은 무시합니다. CR3, CPL, TLS, 일반 또는 FP 입력 변경은 재설치하고 부분 실패·취소·예외는 재사용을 무효화합니다. VP를 다시 만들면 전체 상태부터 설치합니다. 중복 전송을 줄이며 명령 허용 범위를 넓히거나 전체 속도 향상을 주장하지 않습니다.

WHP는 WhpXsaveRegisters.def의 x87/SSE 메타데이터를 일반 레지스터와 동일한 WHvGetVirtualProcessorRegisters 호출로 읽습니다. 중지된 vCPU는 동일한 파티션 임대로 보호됩니다. 상태 게시 전에 전체 XSAVE 캡처와 모든 메타데이터 일관성 검사를 수행합니다. 스텝당 호스트 API 호출 하나를 줄이지만 처리량 향상을 측정한 결과는 아닙니다.

CheckedAArch64Instructions.def와 AArch64InstructionEffects는 EL0/EL1에서 제한된 기본 FP32/FP64 연산·비교·이동과 고정 폭 SIMD를 허용합니다. FPCR는 네 가지 반올림 모드, FZ, DN을 지원하고 FPSR는 누적 상태와 QC를 보존합니다. 미지원 제어·상태 비트는 변경 전에 거부합니다. FP16 연산, SVE/SME, 마스크되지 않은 예외, 선택적 확장과 목록 밖 형식은 명시적으로 실패합니다. Windows ARM64 드라이버 로딩이나 다른 OS 환경은 추가하지 않습니다.

AArch64InstructionEffects는 최대 128비트 피연산자의 스칼라·FP/SIMD 단일/쌍 RAM 범위를 소유합니다. 공유 주소 공간은 CPU 진입 전 모든 페이지를 검사하고 RAMTransaction은 선언된 전체 물리 쓰기만 커밋합니다. 128비트 쓰기는 실행 전에 두 개의 64비트 값으로 순서대로 관찰됩니다. 정지와 오류는 RAM, 벡터와 주소 갱신을 보존합니다. Xn/Vn 번호 중복은 유효하며 쌍 접근 범위의 주소 래핑은 거부됩니다. NeverDAArch64MemoryTests는 독립적인 AArch64CrossPageCases.def와 AArch64VectorMemoryCases.def를 사용합니다.

KVM x64/ARM64는 KvmRunControl을 통해 같은 전용 vCPU 작업 스레드에서 상태 준비, KVM_RUN, 상태 캡처를 수행합니다. EINTR 재시도에도 준비는 한 번이며 취소나 캡처 실패는 게시할 수 없습니다. KvmAArch64Machine.cpp의 주소 변환 유지와 전체 스칼라·벡터 전송도 하나의 단일 단계 기한을 공유합니다. 호출 스레드는 완료 확인 후 커밋하며 ISA 해석, RAM 트랜잭션, OS 정책과 관찰자를 담당합니다. 네이티브 ARM64 실기 증거는 아직 없습니다.

KVM은 X64HostRegisters.def와 X64FPState.def에 따라 일반 레지스터와 전체 FP/SSE 상태를 마지막으로 완료 확인한 디버그 종료 상태와 비교하고 변경된 입력을 다시 설치합니다. 호스트 쓰기와 컨텍스트 복원도 비교에 포함되며 예외, 취소와 실패는 재사용을 무효화합니다. 단일 단계 설정과 실제 일반/FP 상태 읽기는 명령마다 수행합니다.

x64 KVM은 KVM_CAP_SYNC_REGS를 조회하고 지원되는 KVM_SYNC_X86_REGS와 KVM_SYNC_X86_SREGS를 각각 사용합니다. 완료가 확인된 KVM_RUN은 공유 영역에 실제 레지스터를 반환하므로 연속으로 성공한 스텝에서 KVM_GET_REGS와 KVM_GET_SREGS를 생략할 수 있습니다. 미지원 집합이나 선택적 조회 실패는 ioctl 경로를 유지합니다. 변경된 입력은 여전히 KVM_SET_GUEST_DEBUG 전에 설치하며 공유 dirty 비트는 0으로 유지합니다. 예외, 취소, 캡처 실패는 재사용을 무효화합니다. 전체 FP/SSE 캡처는 필수지만 변경 없는 FP 입력의 XSAVE 재인코딩은 생략합니다. 이는 전송 호출 감소이며 전체 실행 속도 향상을 입증하지는 않습니다. KVM API.

하드웨어 실행 자체가 더 짧은 전체 지연 시간을 보장하지는 않습니다. 현재 네이티브 실행은 명령마다 허용 검사, 관찰, 상태 전송과 VM 종료를 수행합니다. 같은 원본 이미지와 시나리오를 동일한 명령·이벤트 예산으로 비교하고 시간과 함께 결과 일치를 보고해야 합니다. CLI 지연에는 시작과 로드도 포함합니다.

checked Unicorn은 MachineRunControl을 사용하며 ARM64 유지보수, 게스트 실행과 전체 상태 읽기를 한 단계 시간 한도에서 처리합니다. UC_HOOK_CODE는 명령 진입에서 빌린 정지 토큰과 기한을 확인합니다. 동기 엔진 호출은 반환 전에 hook 참조를 해제하지만 기계 단계는 상태 게시까지 제어를 유지합니다. Unicorn과 WHP는 전체 CPU 상태를 임시 저장하고 성공한 단계의 게시 직전에 같은 제어 조건을 확인합니다. WHP는 준비 전에 시간 한도를 한 번만 만듭니다. 확인된 x64 CPU 예외는 상태 읽기 중 도착한 정지 요청보다 우선합니다. 읽기가 취소되면 checked RAM 트랜잭션은 추측 쓰기를 버리며 비제한 소프트웨어 계약은 그대로입니다. MachineInterruptedError는 확인된 취소와 호스트 또는 상태 읽기 실패를 구분합니다. 공통 checked CPU는 Stopped 또는 Deadline을 반환하고 CPU/RAM을 유지하며 재시도를 허용합니다. 동시 정지 요청이 있어도 실제 실패는 BackendFailure로 남습니다.

RunDeadline::invoke는 중지되었거나 기한이 지난 WHP 실행을 호스트 호출 전에 거부하고, 취소 중에도 실제 호스트 결과를 보존하며, 빌린 중지 토큰을 해제하기 전에 인터럽트 콜백의 종료를 확인합니다. KVM과 WHP는 실행 임대를 보유한 호출 스레드에서 완전히 캡처된 비공개 상태를 검증한 다음 동시에 도착한 중지나 기한을 분류합니다. 실제 호스트·캡처 실패와 인증된 x64 CPU 예외가 우선합니다. 일반 성공 상태는 취소 확인이 끝날 때까지 비공개로 유지하며, 확인된 중단은 추측적 CPU/RAM 효과를 버리고 재시도를 허용합니다. 준비, 네이티브 실행, 캡처는 하나의 스텝 유예를 공유합니다. 협력적 취소를 제공하지만 엄격한 실제 시간 상한은 보장하지 않습니다.

macOS HVF

hvf · Hypervisor.framework · Apple Silicon → ARM64 · Intel Mac → x86-64.

Setup, signing and native hardware validation (English)

checked ARM64는 8/16/32/64비트 LDXR/STXR, 32/64비트 레지스터 쌍 LDXP/STXP, acquire/release 형태와 CLREX를 지원합니다. KVM, WHP, checked Unicorn은 ISA 계층의 독점 모니터를 공유하며 16바이트 물리 범위로 예약을 추적합니다. 전송 계층의 단일 단계 종료가 루프 진행을 막지 않습니다. 동일 값 쓰기도 커밋되면 예약을 무효화하며 별칭과 보존 뷰에도 같은 규칙을 적용합니다. 중지는 미공개 상태를 보존하며 스냅샷은 중간에 발생한 쓰기를 취소하지 못합니다. checked 독점 명령은 FEAT_LSE2 정렬 규칙을 사용합니다. 정렬된 16바이트 블록 안의 비정렬 피연산자는 실행되며, 블록을 넘으면 alignment 오류가 발생합니다. 같은 폭의 조건부 저장은 예약된 물리 단위로 일치 여부를 판단합니다. 예약이 만료된 경우에도 조건부 저장 판정 전에 정렬과 권한을 검사합니다. 독점 명령은 계속 일반 RAM만 허용합니다. ARM64 Unicorn의 Software 계약도 이 모니터를 사용하며 소프트웨어 CPU와 checked CPU가 물리 RAM을 공유하는 경우를 포함합니다. Unicorn의 Software 계약은 엔진의 자연 정렬 모델을 유지합니다.

같은 ISA 계층은 FEAT_LSE CAS/CASP, SWP, LDADD/LDCLR/LDEOR/LDSET, 부호 있는/없는 min/max의 바이트·하프워드·워드·더블워드 및 acquire/release 형식을 지원합니다. checked는 위의 정렬 정책을, Unicorn Software는 자연 정렬을 사용합니다. 비교는 피연산자 폭에 따르고 반환되는 이전 값은 0으로 확장합니다. CAS 비교가 실패해도 쓰기 권한을 확인하고, Arm이 허용하는 이전 값 쓰기를 선택하여 물리 예약을 무효화합니다. 콜백은 커밋 전 CPU/RAM을 보며 취소와 동기 오류는 부분 결과를 공개하지 않습니다. 병렬 CPU와 MMIO 원자 연산은 동시 커밋 계약을 따릅니다. MRS/MSR NZCV는 예약 비트와 영 레지스터 규칙에 따라 네 조건 플래그를 전송합니다. 읽기 권한을 먼저 검사합니다. 읽을 수 없는 피연산자는 읽기 오류, 읽기 전용 피연산자는 쓰기 오류를 보고하며 원본 Windows ARM64 관측과 일치합니다.

CPU0 명시적 선점, 가상 시계 의미와 현재 한계는 드라이버 스케줄링을 참조하세요.