[PATCH] x86: Ignore CS, DS, ES, and SS segment-override prefixes in 64-bit mode

H.J. Lu hjl.tools@gmail.com
Sun Oct 25 17:19:15 GMT 2020


On Sun, Oct 25, 2020 at 10:10 AM Borislav Petkov <bp@suse.de> wrote:
>
> In 64-bit mode, the four segment override prefixes are ignored:
>
> "In 64-bit mode, the CS, DS, ES, and SS segment-override prefixes have
> no effect. These four prefixes are not treated as segment-override
> prefixes for the purposes of multiple-prefix rules. Instead, they are
> treated as null prefixes." (AMD APM v2).
>
> However, objdump disassembles instructions containing those ignored
> prefixes by still generating that segment override:
>
>   66 66 2e 0f 1f 84 00  data16 nopw %cs:0x0(%rax,%rax,1)
>   00 00 00 00
>
> Print those segment override prefixes as excessive ones:
>
>   66 66 2e 0f 1f 84 00    data16 cs nopw 0x0(%rax,%rax,1)
>   00 00 00 00
>
> which is what they actually are - they have no effect and the decoding
> hardware ignores them.
> ---
>  binutils/ChangeLog |  5 +++++
>  opcodes/i386-dis.c | 20 ++++++++++++++++----
>  2 files changed, 21 insertions(+), 4 deletions(-)
>
> diff --git a/binutils/ChangeLog b/binutils/ChangeLog
> index 4c14fd15103c..0d8a483b3779 100644
> --- a/binutils/ChangeLog
> +++ b/binutils/ChangeLog
> @@ -1,3 +1,8 @@
> +2020-10-25 Borislav Petkov <bp@suse.de>
> +
> +       * opcodes/i386-dis.c: Ignore CS,DS,FS,ES segment override prefix in
> +       64-bit mode.
> +
>  2020-10-22  H.J. Lu  <hongjiu.lu@intel.com>
>
>         * testsuite/binutils-all/objcopy.exp (objcopy_test): Report
> diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
> index 068858b1e772..adac57c45b75 100644
> --- a/opcodes/i386-dis.c
> +++ b/opcodes/i386-dis.c
> @@ -9141,22 +9141,34 @@ ckprefix (void)
>         case 0x2e:
>           prefixes |= PREFIX_CS;
>           last_seg_prefix = i;
> -         active_seg_prefix = PREFIX_CS;
> +
> +         if (address_mode != mode_64bit)
> +           active_seg_prefix = PREFIX_CS;
> +
>           break;
>         case 0x36:
>           prefixes |= PREFIX_SS;
>           last_seg_prefix = i;
> -         active_seg_prefix = PREFIX_SS;
> +
> +         if (address_mode != mode_64bit)
> +           active_seg_prefix = PREFIX_SS;
> +
>           break;
>         case 0x3e:
>           prefixes |= PREFIX_DS;
>           last_seg_prefix = i;
> -         active_seg_prefix = PREFIX_DS;
> +
> +         if (address_mode != mode_64bit)
> +           active_seg_prefix = PREFIX_DS;
> +
>           break;
>         case 0x26:
>           prefixes |= PREFIX_ES;
>           last_seg_prefix = i;
> -         active_seg_prefix = PREFIX_ES;
> +
> +         if (address_mode != mode_64bit)
> +           active_seg_prefix = PREFIX_ES;
> +
>           break;
>         case 0x64:
>           prefixes |= PREFIX_FS;
> --
> 2.21.0
>

2 comments:

1. A testcase is missing and the ignore segment override prefix
should be displayed.
2. opcodes ChangeLog is in opcodes/ChangeLog.

-- 
H.J.


More information about the Binutils mailing list