On Tue, Jun 20, 2017 at 10:34:00PM -0400, Todd Mortimer wrote:
> > 2. This patch also hits NOP sleds > 8 bytes on i386. We could also hit
> > the NOP sleds between 3 and 7 bytes if there are no objections.
>
> The attached diff implements the same trapsled mechanism for i386 and
> amd64 for all padding sequences between 3 and 15 bytes.
>
> I have put this through a kernel and base build on i386 without apparent
> ill effect, and the amd64 parts are unchanged from the last diff.
>
> Todd
>
>
reads ok to me, thanks again for your work here.
-ml
> Index: gas/config/tc-i386.c
> ===================================================================
> RCS file: /cvs/src/gnu/usr.bin/binutils-2.17/gas/config/tc-i386.c,v
> retrieving revision 1.7
> diff -u -p -u -p -r1.7 tc-i386.c
> --- gas/config/tc-i386.c 4 Jun 2017 20:26:18 -0000 1.7
> +++ gas/config/tc-i386.c 21 Jun 2017 00:43:14 -0000
> @@ -505,41 +505,9 @@ i386_align_code (fragP, count)
> {0x90}; /* nop */
> static const char f32_2[] =
> {0x89,0xf6}; /* movl %esi,%esi */
> - static const char f32_3[] =
> - {0x8d,0x76,0x00}; /* leal 0(%esi),%esi
> */
> - static const char f32_4[] =
> - {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
> - static const char f32_5[] =
> - {0x90, /* nop */
> - 0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
> - static const char f32_6[] =
> - {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
> - static const char f32_7[] =
> - {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
> - static const char f32_8[] =
> - {0x90, /* nop */
> - 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
> - static const char f32_9[] =
> - {0x89,0xf6, /* movl %esi,%esi
> */
> - 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
> - static const char f32_10[] =
> - {0x8d,0x76,0x00, /* leal 0(%esi),%esi */
> - 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
> - static const char f32_11[] =
> - {0x8d,0x74,0x26,0x00, /* leal 0(%esi,1),%esi */
> - 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
> - static const char f32_12[] =
> - {0x8d,0xb6,0x00,0x00,0x00,0x00, /* leal 0L(%esi),%esi */
> - 0x8d,0xbf,0x00,0x00,0x00,0x00}; /* leal 0L(%edi),%edi */
> - static const char f32_13[] =
> - {0x8d,0xb6,0x00,0x00,0x00,0x00, /* leal 0L(%esi),%esi */
> - 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
> - static const char f32_14[] =
> - {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00, /* leal 0L(%esi,1),%esi */
> - 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
> static const char f32_15[] =
> - {0xeb,0x0d,0x90,0x90,0x90,0x90,0x90, /* jmp .+15; lotsa nops */
> - 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90};
> + {0xeb,0x0d,0xCC,0xCC,0xCC,0xCC,0xCC, /* jmp .+15; lotsa int3 */
> + 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC};
> static const char f16_3[] =
> {0x8d,0x74,0x00}; /* lea 0(%esi),%esi
> */
> static const char f16_4[] =
> @@ -556,40 +524,31 @@ i386_align_code (fragP, count)
> static const char f16_8[] =
> {0x8d,0xb4,0x00,0x00, /* lea 0w(%si),%si */
> 0x8d,0xbd,0x00,0x00}; /* lea 0w(%di),%di */
> + static const char f64_2[] =
> + {0x66,0x90}; /* data16, nop*/
> static const char *const f32_patt[] = {
> - f32_1, f32_2, f32_3, f32_4, f32_5, f32_6, f32_7, f32_8,
> - f32_9, f32_10, f32_11, f32_12, f32_13, f32_14, f32_15
> + f32_1, f32_2, f32_15, f32_15, f32_15, f32_15, f32_15, f32_15,
> + f32_15, f32_15, f32_15, f32_15, f32_15, f32_15, f32_15
> };
> static const char *const f16_patt[] = {
> f32_1, f32_2, f16_3, f16_4, f16_5, f16_6, f16_7, f16_8,
> f32_15, f32_15, f32_15, f32_15, f32_15, f32_15, f32_15
> };
> + static const char *const f64_patt[] = {
> + f32_1, f64_2, f32_15, f32_15, f32_15, f32_15, f32_15, f32_15,
> + f32_15, f32_15, f32_15, f32_15, f32_15, f32_15, f32_15
> + };
>
> if (count <= 0 || count > 15)
> return;
>
> - /* The recommended way to pad 64bit code is to use NOPs preceded by
> - maximally four 0x66 prefixes. Balance the size of nops. */
> if (flag_code == CODE_64BIT)
> {
> - int i;
> - int nnops = (count + 3) / 4;
> - int len = count / nnops;
> - int remains = count - nnops * len;
> - int pos = 0;
> -
> - for (i = 0; i < remains; i++)
> - {
> - memset (fragP->fr_literal + fragP->fr_fix + pos, 0x66, len);
> - fragP->fr_literal[fragP->fr_fix + pos + len] = 0x90;
> - pos += len + 1;
> - }
> - for (; i < nnops; i++)
> - {
> - memset (fragP->fr_literal + fragP->fr_fix + pos, 0x66, len - 1);
> - fragP->fr_literal[fragP->fr_fix + pos + len - 1] = 0x90;
> - pos += len;
> - }
> + memcpy(fragP->fr_literal + fragP->fr_fix,
> + f64_patt[count -1], count);
> + if (count > 2)
> + /* Adjust jump offset */
> + fragP->fr_literal[fragP->fr_fix + 1] = count - 2;
> }
> else
> if (flag_code == CODE_16BIT)
> @@ -601,8 +560,13 @@ i386_align_code (fragP, count)
> fragP->fr_literal[fragP->fr_fix + 1] = count - 2;
> }
> else
> + {
> memcpy (fragP->fr_literal + fragP->fr_fix,
> f32_patt[count - 1], count);
> + if (count > 2)
> + /* Adjust jump offset */
> + fragP->fr_literal[fragP->fr_fix + 1] = count - 2;
> + }
> fragP->fr_var = count;
> }
>