

Summary
-
지원 여부 확인
→ CPUID 및 MSR 확인
- IA32_PERF_CAPABILITIES MSR에서 PEBSRecordFormat 및 관련 플래그를 확인하여 PEBS 지원 여부 및 레코드 포맷 타입 확인
- PEBS 기능은 IA32_PEBS_ENABLE MSR 비트로 제어 (Core 계열에서는 IA32_PMC0)
-
DS Save Area 준비
- IA32_DS_AREA MSR에 DS Save Area의 base address 기록
- DS Sava Area
- Buffer Management Area
- BTS Buffer (Branch 어쩌구)
- PEBS Buffer (precise event 기록용)
- Buffer Management Area 필드 설정
- PEBS buffer base
- PEBS index
- PEBS absolute maximum
- PEBS interrupt threshold
- PEBS counter reset
-
Performance Counter 설정
- IA32_PMC0와 IA32_PERFEVTSEL0에 PEBS로 측정할 precise event 선택 (L3 mixx 등)
- Performance counter를 overflow 조건으로 PEBS trigger 설정 (N번 event마다 OV → PEBS 샘플링)
-
PEBS Enable
- IA32_PEBS_ENABLE MSR에서 bit 0 (Enable PEBS on PMC0) 설정
-
ISR (Interrupt Service Routine) 작성
- PEBS 이벤트 발생 시 PMI (Performance Monitoring Interrupt)가 들어옴
- ISR에서 해야 할 일
- MSR_PERF_GLOBAL_STATUS 확인 → 어떤 counter가 OV 했는지
- DS Save Area에서 PEBS record 읽고 아키텍처 상태 (IP, RFLAGS, 레지스터 정보 등) 확보
- MSR_PERF_GLOBAL_OVF_CTL에서 OV flag clear
- 필요 시 IA32_PERF_GLOBAL_CTRL에서 카운터 재활성화
-
PEBS Record Format 확인
- IA32_PERF_CAPABILITIES의 PEBSRecordFormat (BIT 11:8) 값에 따라 레코드 필드 다름
- 일반 레지스터, RIP, RFLAGS 기본으로 있고, IA32_PERF_GLOBAL_STATUS의 필드들, load latency, TSX 정보, TSC 등 포함될수있음
-
Re-configuring
- 이벤트 새로 설정할 때는 바로 바꾸지 말고, latent(잔여) PEBS 레코드가 버퍼에 기록을 완료하도록 quiescent period (정지 시간) 두자
$\color{white}\rule{330px}{2px}$


CPUID 명령을 EAX=1로 넣을 때 EDX (RDX의 하위 32bit)의 21번 Bit가 Set이면 Debug Store (DS) 지원