I've been performing experiments with LBR tracing on a core i7 920. It seems, however, that the LBR_SELECT MSR, which can be used for filter LBR events, is behaving weirdly. It appears that certain bits (responsible for filtering out certain types of branches) are not doing what they should.
For example, if I set LBR_SELECT to 0x0, everything seems to be captures, as expected. However, if I set it to capture just CALLs and RETs in CPL 0, by setting it to 0x1c6, nothing gets captures, even though I know that CALL and RET instruction are being executed in CPL 0. And once I enable the capture of far branches, by setting it to 0xc6, suddenly is starts working again, and I can see calls, rets and far branches. It's almost as if the far branches filtering bit controlled the others, which of course does not make sense.
Are any of the bits in LBR_SELECT mutually exclusive, or are there any other constraints that need to be considered which were not described in the Developer's Manual? Or are there any know bugs in core i7 920's implementation of LBR_SELECT?