On Mar 27 10:26, Jeremy Drake via Cygwin-patches wrote:
> On Thu, 27 Mar 2025, Corinna Vinschen wrote:
> 
> > Hi Jeremy,
> >
> > ok, three questions...
> >
> > Q1: How does it compare performancewise to the old code?  Fortunately
> >     it's only called once per process tree, so this shoudn't have much
> >     impact, but still nice to know...
> 
> How would you go about finding that out?
> 
> > Q2: Would you mind to add more comments?
> >
> > Q2a: A preceeding one line comment briefly explaining the function?
> >
> > > +static inline const void *
> > > +rip_rel_offset (const ud_t *ud_obj, const ud_operand_t *opr, int 
> > > sub_off=0)
> 
> rip_rel_offset helper function?  OK...

Yeah, I'm aware that the name is kind of speaking, but still...

The number of code snippets I wrote myself but had a hard time
understanding 10 years later makes me wary.

> > Q2b: Comment like "Initializing" blah?
> >
> > > +  ud_t ud_obj;
> > > +  ud_init (&ud_obj);
> > > +  ud_set_mode (&ud_obj, 64);
> > > +  ud_set_input_buffer (&ud_obj, get_dir, 80);
> > > +  ud_set_pc (&ud_obj, (const uint64_t) get_dir);
> 
> > > -     On Pre-Windows 8 we basically look for the RtlEnterCriticalSection 
> > > call.
> > > -     Windows 8 does not call RtlEnterCriticalSection.  The code 
> > > manipulates
> > > -     the FastPebLock manually, probably because RtlEnterCriticalSection 
> > > has
> > > -     been converted to an inline function.  Either way, we test if the 
> > > code
> > > -     uses the FastPebLock. */
> > > +     On Pre- (or Post-) Windows 8 we basically look for the
> >
> > Q3: or post?  Really?  AFAIK, this was only an issue on pre W8, so it
> >     affects Vista and W7 only.  Theoretically this check can go away,
> >     unless you have proof this is still an issue in some later Windows
> >     starting with 8.1.
> 
> I haven't confirmed what pre-8 does, but 8.0 appears to inline
> RtlEnterCriticalSection while 8.1 and later call it.  Based on the
> comment, it seems 8.0 is the odd-version-out here.

Yeah, but we don't support 8.0 anymore, only 8.1.

> > > +     RtlEnterCriticalSection.  The code manipulates the FastPebLock 
> > > manually,
> > > +     probably because RtlEnterCriticalSection has been converted to an 
> > > inline
> > > +     function.  Either way, we test if the code uses the FastPebLock. */
> 
> > Q2c: Roundabout here, I'm getting the impression we're losing
> >      more comments than we gain.  This is not a good way to raise
> >      confidence ;)
> >
> > Codewise I have nothing to carp at, but comments are a bit sparse
> > for my taste...
> 
> I thought the only comments I lost were related to each insider version
> workaround that was piled on top that are no longer necessary.

Hmm, ok.  Never mind then.

> BTW, something I would *like* to do but haven't figured out how to
> accomplish cleanly yet is to follow the registers.  What I mean by this is
> illustrated by what I did in the aarch64 version: I could find the call to
> RtlEnterCrticalSection, then work backwards, find the add whose Rd was x0
> (the register for the first (pointer) parameter in the calling
> convention), then find the adrp whose Rd was the Rn of the add.  What I
> would do on x86_64 is find the call to RtlEnterCriticalSection, find any
> mov rcx, <reg> before, then find the lea <reg>, [rip+XXX] (where reg would
> be rcx if there wasn't a mov rcx after the lea).  Unfortunately, the
> variable length-ness doesn't lend itself to iterating backwards, so I am
> not confirming that the lea actually ends up in rcx for the function call.
> The only register correlation I do is that the register used in the
> mov <reg>, QWORD PTR [rip+XXX] is then used in the next instruction that
> must be test <reg>, <reg>.  The old code required that <reg> to be rbx,
> but I don't see any reason that rbx is required...

Yeah, reading x86_64 backwards will lead to confusion.  And no, rbx
isn't required, any non-volatile register could do it.  It seems that
rbx is used because of the way vc++ allocates register.


Corinna

Reply via email to