Laszlo,

I do like this typedef idea.

  typedef VOID (X86_ASSEMBLY_LABEL) (VOID);

Maybe change the name so it is clearer that 
this should never be used in a call.  A comment
block about the typedef can also clarify the
expected usage.

  typedef VOID (X86_ASSEMBLY_PATCH_LABEL) (VOID);

Thanks,

Mike

> -----Original Message-----
> From: Laszlo Ersek [mailto:[email protected]]
> Sent: Monday, February 5, 2018 11:23 AM
> To: Kinney, Michael D <[email protected]>;
> edk2-devel-01 <[email protected]>
> Cc: Ard Biesheuvel <[email protected]>; Dong,
> Eric <[email protected]>; Yao, Jiewen
> <[email protected]>; Leif Lindholm
> <[email protected]>; Gao, Liming
> <[email protected]>; Ni, Ruiyu <[email protected]>
> Subject: Re: [PATCH 00/14] rid PiSmmCpuDxeSmm of DB-
> encoded instructions
> 
> On 02/05/18 19:22, Kinney, Michael D wrote:
> > Laszlo,
> >
> > Let's see if we can close on the timeline for
> > the .S/.asm RFC this week.
> >
> > I am concerned about making them UINT8 from C code
> > because future maintainer may think that the patch
> > value type is UINT8.
> >
> > Labels in assembly that are defined to be a function
> > that is callable from C code does not have a storage
> > type.  Why can't we make these labels the same way?
> 
> To my understanding, the labels in the NASM source code
> for functions
> and variables look the same; the actual declaration
> only comes from the
> C code.
> 
> (Assuming we declare a NASM label as a function in the
> C source, nothing
> in the toolchain enforces an actual match between
> caller and callee; it
> is possible to call the function (from C) through a
> declaration that
> doesn't match the actual assembly implementation. IOW
> it's up to us to
> avoid such bugs.)
> 
> If I understand correctly, you are suggesting that we
> take a label from
> the NASM source that stands right after an instruction
> to patch, and we
> declare it as a function in the C source. (With what
> prototype though?
> The label does not actually introduce a function
> definition in the
> assembly code; it would make no sense to call it.)
> Then, for the
> patching, I presume your suggestion is to convert the
> address of the
> function to UINTN, perform the subtraction, etc.
> Something like:
> 
>   typedef VOID (X86_ASSEMBLY_LABEL) (VOID);
> 
> (This is not a pointer-to-function type, but a function
> type.)
> 
> A declaration using the typedef would be
> 
>   extern X86_ASSEMBLY_LABEL gPatchCr3;
> 
> (This declares an extern function, not a pointer to a
> function.)
> 
> The patching function would take a pointer to a
> function:
> 
>   VOID
>   EFIAPI
>   PatchInstructionX86 (
>     OUT X86_ASSEMBLY_LABEL *InstructionEnd,
>     IN  UINT64             PatchValue,
>     IN  UINTN              ValueSize
>     );
> 
> and the implementation would have to do e.g.
> 
>   WriteUnaligned32 (
>     (UINT32 *)(UINTN)InstructionEnd - 1,
>     (UINT32)PatchValue
>     );
> 
> It would be called like
> 
>   PatchInstructionX86 (&gPatchCr3, Value, 4);
> 
> 
> But, what does this buy us in comparison to just:
> 
>   typedef UINT8 X86_ASSEMBLY_LABEL;
> 
> ?
> 
> If you worry that a future maintainer misunderstands
> the UINT8, then we
> can as well hide the UINT8 behind a typedef;
> X86_ASSEMBLY_LABEL doesn't
> have to be a function type for the hiding. (Conversely,
> when using a
> function type as underlying type, I worry that a future
> maintainer might
> be tempted to call them :) )
> 
> Thanks,
> Laszlo
> 
> >> -----Original Message-----
> >> From: Laszlo Ersek [mailto:[email protected]]
> >> Sent: Monday, February 5, 2018 2:28 AM
> >> To: Kinney, Michael D <[email protected]>;
> edk2-
> >> devel-01 <[email protected]>
> >> Cc: Ard Biesheuvel <[email protected]>;
> Dong,
> >> Eric <[email protected]>; Yao, Jiewen
> >> <[email protected]>; Leif Lindholm
> >> <[email protected]>; Gao, Liming
> >> <[email protected]>; Ni, Ruiyu
> <[email protected]>
> >> Subject: Re: [PATCH 00/14] rid PiSmmCpuDxeSmm of DB-
> >> encoded instructions
> >>
> >> On 02/03/18 01:45, Kinney, Michael D wrote:
> >>> Laszlo,
> >>>
> >>> Thanks for all the work on this series and the very
> >>> detailed commit messages.
> >>>
> >>> Liming's email on removing the .S and .asm files is
> an
> >>> RFC.  We need to see this RFC approved before we
> can
> >>> commit changes to remove .S and .asm files.  This
> >> should
> >>> be a separate activity.
> >>
> >> Sure, I can drop that patch, but then the
> PiSmmCpuDxeSmm
> >> changes in the
> >> other patches will divert the NASM files from the .S
> and
> >> .asm files. Is
> >> that (temporary) non-uniformity better than removing
> the
> >> .S and .asm files?
> >>
> >>> One odd thing I see in this series is that the
> >> instruction
> >>> patch label in the .nasm file is just a label and
> does
> >> not
> >>> have any storage associated with it.
> >>
> >> No, this is not correct; the storage that is
> associated
> >> with each of
> >> these "patch labels" is the one byte (UINT8)
> directly
> >> following the
> >> label -- whatever that byte might be. It is
> generally
> >> part of a totally
> >> unrelated instruction.
> >>
> >> In case we had to patch an immediate operand that
> >> happened to comprise
> >> the very last byte(s) of a NASM source file, *then*
> we'd
> >> have to add one
> >> dummy DB at the end, just so there was something
> that the
> >> label directly
> >> refered to.
> >>
> >> This is why UINT8 is a good type here, because it
> >> requires us to add the
> >> least amount of padding.
> >>
> >>> But in the C code
> >>> the type UINT8 is used with the label which implies
> >> some
> >>> storage.  Can we make the globals in C code be a
> >> pointer
> >>> (maybe VOID *) instead of UINT8?
> >>
> >> I don't think so. For building the addresses, we
> rely on
> >> the linker, and
> >> the linker needs definitions (allocations) of
> objects.
> >> Your above
> >> observation is correct (i.e. that storage is
> required),
> >> my addition to
> >> that is that storage is *already* allocated (one
> UINT8
> >> per patch label /
> >> symbol).
> >>
> >> Thanks!
> >> Laszlo

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to