/* $Id: event_set_centaur.c,v 1.1 2003/02/16 21:08:54 mikpe Exp $ * Performance counter event descriptions for Centaur chips: * IDT WinChip C6/2/3 and VIA C3. * * Copyright (C) 2003 Mikael Pettersson * * References * ---------- * [WinChip C6] "WinChip C6 Processor Data Sheet". * [WinChip 2A] "WinChip 2 Processor Version A Data Sheet". * [WinChip 3] "WinChip 3 Processor Data Sheet". * (at http://www.centtech.com/) * * [VIA C3] "VIA C3 Samuel 2 Processor Datasheet", Ver. 1.03, April 2001. * Note: The C3 was originally called "Cyrix III", but it is a Centaur * design developed as a replacement for Cyrix' "Joshua". * (at http://www.viatech.com/) */ #include /* for NULL */ #include "libperfctr.h" #include "event_set.h" /* * Centaur WinChip C6 events. * Note: The manual lists the codes in decimal, not hex as done here. */ static const struct perfctr_event wcc6_events[] = { { 0x00, 0x3, NULL, "INTERNAL_CLOCKS" }, { 0x01, 0x3, NULL, "VALID_CYCLES_REACHING_WRITEBACKS" }, { 0x02, 0x3, NULL, "X86_INSTRUCTIONS" }, { 0x47, 0x3, NULL, "DATA_READ_CACHE_MISSES" }, { 0x4A, 0x3, NULL, "DATA_WRITE_CACHE_MISSES" }, { 0x63, 0x3, NULL, "INSTRUCTION_FETCH_CACHE_MISSES" }, }; const struct perfctr_event_set perfctr_wcc6_event_set = { .cpu_type = PERFCTR_X86_WINCHIP_C6, .event_prefix = "WCC6_", .include = NULL, .nevents = ARRAY_SIZE(wcc6_events), .events = wcc6_events, }; /* * Centaur WinChip 2 and 3 events. * Note: The manual lists the codes in decimal, not hex as done here. */ static const struct perfctr_event wc2_events[] = { { 0x00, 0x3, NULL, "DATA_READ" }, { 0x01, 0x3, NULL, "DATA_WRITE" }, { 0x02, 0x3, NULL, "DATA_TLB_MISS" }, { 0x03, 0x3, NULL, "DATA_READ_CACHE_MISS" }, { 0x04, 0x3, NULL, "DATA_WRITE_CACHE_MISS" }, { 0x06, 0x3, NULL, "DATA_CACHE_WRITEBACKS" }, { 0x08, 0x3, NULL, "DATA_CACHE_SNOOP_HITS" }, { 0x09, 0x3, NULL, "PUSH_PUSH_POP_POP_PAIRING" }, { 0x0B, 0x3, NULL, "MISALIGNED_DATA_MEMORY_NOT_IO" }, { 0x0C, 0x3, NULL, "CODE_READ" }, { 0x0D, 0x3, NULL, "CODE_TLB_MISS" }, { 0x0E, 0x3, NULL, "INSTRUCTION_FETCH_CACHE_MISS" }, { 0x13, 0x3, NULL, "BHT_HITS" }, { 0x14, 0x3, NULL, "BHT_CANDIDATE" }, { 0x16, 0x3, NULL, "INSTRUCTIONS_EXECUTED" }, { 0x17, 0x3, NULL, "INSTRUCTIONS_IN_PIPE_2" }, { 0x18, 0x3, NULL, "BUS_UTILIZATION" }, { 0x1D, 0x3, NULL, "IO_READ_OR_WRITE_CYCLE" }, { 0x28, 0x3, NULL, "DATA_READ_OR_DATA_WRITE" }, { 0x2B, 0x1, NULL, "MMX_INSTRUCTIONS_U_PIPE" }, { 0x2B, 0x2, NULL, "MMX_INSTRUCTIONS_V_PIPE" }, { 0x37, 0x1, NULL, "RETURNS_PREDICTED_INCORRECTLY" }, { 0x37, 0x2, NULL, "RETURNS_PREDICTED_CORRECTLY" }, { 0x3F, 0x3, NULL, "INTERNAL_CLOCKS" }, }; const struct perfctr_event_set perfctr_wc2_event_set = { .cpu_type = PERFCTR_X86_WINCHIP_2, .event_prefix = "WC2_", .include = NULL, .nevents = ARRAY_SIZE(wc2_events), .events = wc2_events, }; /* * VIA C3 events. * This processor is a Centaur design, tweaked to look like a Celeron. * Its perfctr MSRs have the same addresses as in the P6, but PERFCTR0 * is an alias for the TSC and EVNTSEL0 is read-only. It appears that * rdpmc(0) returns the TSC truncated to 40 bits. Only EVNTSEL1 and * PERFCTR1 can be used. EVNTSEL1 has a different format than in P6: the * event selection field is 9 bits, and no other fields are defined. * The data sheet only lists the three events defined below. */ static const struct perfctr_event vc3_events[] = { { 0x079, 0x2, NULL, "INTERNAL_CLOCKS" }, { 0x0C0, 0x2, NULL, "INSTRUCTIONS_EXECUTED" }, { 0x1C0, 0x2, NULL, "INSTRUCTIONS_EXECUTED_AND_STRING_ITERATIONS" }, }; const struct perfctr_event_set perfctr_vc3_event_set = { .cpu_type = PERFCTR_X86_VIA_C3, .event_prefix = "VC3_", .include = NULL, .nevents = ARRAY_SIZE(vc3_events), .events = vc3_events, };