Thanks for the pointers, Gabe. I've posted a couple of patches on gerrit.
Let me know what you think.

Jason

On Thu, Mar 8, 2018 at 1:52 AM Gabe Black <gabebl...@google.com> wrote:

> Macroops don't execute, so setting serialization flags on them doesn't
> really make sense. It looks like the rdtsc microop is only used in the
> rdtsc instruction and I can't think of anywhere else it might be used, so
> you can probably change the flags on the microop fairly safely. The easiest
> way to do that is to change the flags that are implied with the TscOp
> operand is used in an "instruction" definition where instruction is in the
> ISA parser sense. In src/arch/x86/isa/operands.isa, you can see that TscOp
> is set up with a tuple returned by the controlReg function. The way the
> tuple is interpreted by the parser is described in some documentation
> somewhere, but basically each element is a list of flags that are set on
> the instruction object in various circumstances like if the operand is
> read, written, etc. You'd want to add flags that are implied when the TscOp
> (and only the TscOp) is read, in addition to the ones it already has when
> written.
>
> According to the AMD manuals I have (I think the AMD manuals are a lot
> easier to read), the RDTSCP instruction is basically the same as the RDTSC
> instruction, except that it also sets the ECX register to the value from
> the TSC_AUX MSR. That value could be the processor ID, or it could be
> anything else software wants. The value is put there by software and it's
> interpretation is entirely up to software, so there's no need to determine
> the processor ID from within the microcode. To fully support RDTSCP you'd
> need to probably define a TSC_AUX msr/control register in gem5 though, and
> teach the MSR accessing bits what it's ID is, etc.
>
> Gabe
>
> On Wed, Mar 7, 2018 at 1:52 PM, Jason Lowe-Power <ja...@lowepower.com>
> wrote:
>
> > Hi all (specifically Gabe),
> >
> > I was trying to run some tests that use the RDTSCP instruction and I
> found
> > that the rdtsc micro op's current implementation isn't quite serializing
> > enough. From the Intel manual:
> >
> > The RDTSCP instruction is not a serializing instruction, but it does wait
> > until all previous instructions have executed and all previous loads are
> > globally visible. But it does not wait for previous stores to be globally
> > visible, and subsequent instructions may begin execution before the read
> > operation is performed. The following items may guide software seeking to
> > order executions of RDTSCP:
> > • If software requires RDTSCP to be executed only after all previous
> stores
> > are globally visible, it can execute MFENCE immediately before RDTSCP.
> > • If software requires RDTSCP to be executed prior to execution of any
> > subsequent instruction (including any memory accesses), it can execute
> > LFENCE immediately after RDTSCP.
> >
> > This sounds like the microop should be "serializing before" in gem5's
> > parlance. I believe that the two instructions RDTSC and RDTSCP have the
> > same semantics, but that is not clearly stated in the instruction
> manual. I
> > don't see any reason not to implement them the same in gem5. Correct me
> if
> > I'm wrong.
> >
> > In testing, I found that making the macro-op serializing doesn't work
> > because it only serializes the final instruction and the TSC has already
> > been read. For instance if you have the following code sequence:
> >
> > rdtscp
> > load miss
> > rdtscp
> >
> > The difference in the two counters is ~load miss time on real hardware.
> In
> > gem5, the difference is ~4 cycles.
> >
> > I've found that this can be fixed by adding the following code to the
> RDTSC
> > micro-op implementation generated by the ISA description in
> > decode-ns.cc.inc.
> >
> > flags[IsSerializeBefore] = true    ;
> >
> > After this change, gem5 reports numbers closer to real hardware.
> >
> > I can't figure out the "right" way to get this code generated, though! I
> > assume I need to somehow change the rdstc micro-op definition in
> regop.isa.
> > Any help would be greatly appreciated!
> >
> > Other quick question: RDTSCP is supposed to return the CPU number along
> > with the TSC value. Any hints has to how to get this from the ISA
> language?
> > Would the best way be to add a new micro-op for this?
> >
> > Thanks,
> > Jason
> > _______________________________________________
> > gem5-dev mailing list
> > gem5-dev@gem5.org
> > http://m5sim.org/mailman/listinfo/gem5-dev
> _______________________________________________
> gem5-dev mailing list
> gem5-dev@gem5.org
> http://m5sim.org/mailman/listinfo/gem5-dev
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to