lkml.org 
[lkml]   [2020]   [Apr]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 06/75] x86/insn: Make inat-tables.c suitable for pre-decompression code
    Date
    From: Joerg Roedel <jroedel@suse.de>

    The inat-tables.c file has some arrays in it that contain pointers to
    other arrays. These pointers need to be relocated when the kernel
    image is moved to a different location.

    The pre-decompression boot-code has no support for applying ELF
    relocations, so initialize these arrays at runtime in the
    pre-decompression code to make sure all pointers are correctly
    initialized.

    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    ---
    arch/x86/tools/gen-insn-attr-x86.awk | 50 +++++++++++++++++++++-
    tools/arch/x86/tools/gen-insn-attr-x86.awk | 50 +++++++++++++++++++++-
    2 files changed, 98 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/tools/gen-insn-attr-x86.awk b/arch/x86/tools/gen-insn-attr-x86.awk
    index a42015b305f4..af38469afd14 100644
    --- a/arch/x86/tools/gen-insn-attr-x86.awk
    +++ b/arch/x86/tools/gen-insn-attr-x86.awk
    @@ -362,6 +362,9 @@ function convert_operands(count,opnd, i,j,imm,mod)
    END {
    if (awkchecked != "")
    exit 1
    +
    + print "#ifndef __BOOT_COMPRESSED\n"
    +
    # print escape opcode map's array
    print "/* Escape opcode map array */"
    print "const insn_attr_t * const inat_escape_tables[INAT_ESC_MAX + 1]" \
    @@ -388,6 +391,51 @@ END {
    for (j = 0; j < max_lprefix; j++)
    if (atable[i,j])
    print " ["i"]["j"] = "atable[i,j]","
    - print "};"
    + print "};\n"
    +
    + print "#else /* !__BOOT_COMPRESSED */\n"
    +
    + print "/* Escape opcode map array */"
    + print "static const insn_attr_t *inat_escape_tables[INAT_ESC_MAX + 1]" \
    + "[INAT_LSTPFX_MAX + 1];"
    + print ""
    +
    + print "/* Group opcode map array */"
    + print "static const insn_attr_t *inat_group_tables[INAT_GRP_MAX + 1]"\
    + "[INAT_LSTPFX_MAX + 1];"
    + print ""
    +
    + print "/* AVX opcode map array */"
    + print "static const insn_attr_t *inat_avx_tables[X86_VEX_M_MAX + 1]"\
    + "[INAT_LSTPFX_MAX + 1];"
    + print ""
    +
    + print "static void inat_init_tables(void)"
    + print "{"
    +
    + # print escape opcode map's array
    + print "\t/* Print Escape opcode map array */"
    + for (i = 0; i < geid; i++)
    + for (j = 0; j < max_lprefix; j++)
    + if (etable[i,j])
    + print "\tinat_escape_tables["i"]["j"] = "etable[i,j]";"
    + print ""
    +
    + # print group opcode map's array
    + print "\t/* Print Group opcode map array */"
    + for (i = 0; i < ggid; i++)
    + for (j = 0; j < max_lprefix; j++)
    + if (gtable[i,j])
    + print "\tinat_group_tables["i"]["j"] = "gtable[i,j]";"
    + print ""
    + # print AVX opcode map's array
    + print "\t/* Print AVX opcode map array */"
    + for (i = 0; i < gaid; i++)
    + for (j = 0; j < max_lprefix; j++)
    + if (atable[i,j])
    + print "\tinat_avx_tables["i"]["j"] = "atable[i,j]";"
    +
    + print "}"
    + print "#endif"
    }

    diff --git a/tools/arch/x86/tools/gen-insn-attr-x86.awk b/tools/arch/x86/tools/gen-insn-attr-x86.awk
    index a42015b305f4..af38469afd14 100644
    --- a/tools/arch/x86/tools/gen-insn-attr-x86.awk
    +++ b/tools/arch/x86/tools/gen-insn-attr-x86.awk
    @@ -362,6 +362,9 @@ function convert_operands(count,opnd, i,j,imm,mod)
    END {
    if (awkchecked != "")
    exit 1
    +
    + print "#ifndef __BOOT_COMPRESSED\n"
    +
    # print escape opcode map's array
    print "/* Escape opcode map array */"
    print "const insn_attr_t * const inat_escape_tables[INAT_ESC_MAX + 1]" \
    @@ -388,6 +391,51 @@ END {
    for (j = 0; j < max_lprefix; j++)
    if (atable[i,j])
    print " ["i"]["j"] = "atable[i,j]","
    - print "};"
    + print "};\n"
    +
    + print "#else /* !__BOOT_COMPRESSED */\n"
    +
    + print "/* Escape opcode map array */"
    + print "static const insn_attr_t *inat_escape_tables[INAT_ESC_MAX + 1]" \
    + "[INAT_LSTPFX_MAX + 1];"
    + print ""
    +
    + print "/* Group opcode map array */"
    + print "static const insn_attr_t *inat_group_tables[INAT_GRP_MAX + 1]"\
    + "[INAT_LSTPFX_MAX + 1];"
    + print ""
    +
    + print "/* AVX opcode map array */"
    + print "static const insn_attr_t *inat_avx_tables[X86_VEX_M_MAX + 1]"\
    + "[INAT_LSTPFX_MAX + 1];"
    + print ""
    +
    + print "static void inat_init_tables(void)"
    + print "{"
    +
    + # print escape opcode map's array
    + print "\t/* Print Escape opcode map array */"
    + for (i = 0; i < geid; i++)
    + for (j = 0; j < max_lprefix; j++)
    + if (etable[i,j])
    + print "\tinat_escape_tables["i"]["j"] = "etable[i,j]";"
    + print ""
    +
    + # print group opcode map's array
    + print "\t/* Print Group opcode map array */"
    + for (i = 0; i < ggid; i++)
    + for (j = 0; j < max_lprefix; j++)
    + if (gtable[i,j])
    + print "\tinat_group_tables["i"]["j"] = "gtable[i,j]";"
    + print ""
    + # print AVX opcode map's array
    + print "\t/* Print AVX opcode map array */"
    + for (i = 0; i < gaid; i++)
    + for (j = 0; j < max_lprefix; j++)
    + if (atable[i,j])
    + print "\tinat_avx_tables["i"]["j"] = "atable[i,j]";"
    +
    + print "}"
    + print "#endif"
    }

    --
    2.17.1
    \
     
     \ /
      Last update: 2020-04-28 17:18    [W:5.829 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site