lkml.org 
[lkml]   [2020]   [Sep]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: x86/seves] x86/idt: Split idt_data setup out of set_intr_gate()
    The following commit has been merged into the x86/seves branch of tip:

    Commit-ID: 4bed2266cc6f9c3f6cd91378ea4fc76edde674cf
    Gitweb: https://git.kernel.org/tip/4bed2266cc6f9c3f6cd91378ea4fc76edde674cf
    Author: Joerg Roedel <jroedel@suse.de>
    AuthorDate: Mon, 07 Sep 2020 15:15:29 +02:00
    Committer: Borislav Petkov <bp@suse.de>
    CommitterDate: Mon, 07 Sep 2020 21:30:38 +02:00

    x86/idt: Split idt_data setup out of set_intr_gate()

    The code to setup idt_data is needed for early exception handling, but
    set_intr_gate() can't be used that early because it has pv-ops in its
    code path which don't work that early.

    Split out the idt_data initialization part from set_intr_gate() so
    that it can be used separately.

    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Link: https://lkml.kernel.org/r/20200907131613.12703-29-joro@8bytes.org
    ---
    arch/x86/kernel/idt.c | 22 ++++++++++++++--------
    1 file changed, 14 insertions(+), 8 deletions(-)

    diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c
    index 7ecf9ba..53946c1 100644
    --- a/arch/x86/kernel/idt.c
    +++ b/arch/x86/kernel/idt.c
    @@ -205,18 +205,24 @@ idt_setup_from_table(gate_desc *idt, const struct idt_data *t, int size, bool sy
    }
    }

    +static void init_idt_data(struct idt_data *data, unsigned int n,
    + const void *addr)
    +{
    + BUG_ON(n > 0xFF);
    +
    + memset(data, 0, sizeof(*data));
    + data->vector = n;
    + data->addr = addr;
    + data->segment = __KERNEL_CS;
    + data->bits.type = GATE_INTERRUPT;
    + data->bits.p = 1;
    +}
    +
    static __init void set_intr_gate(unsigned int n, const void *addr)
    {
    struct idt_data data;

    - BUG_ON(n > 0xFF);
    -
    - memset(&data, 0, sizeof(data));
    - data.vector = n;
    - data.addr = addr;
    - data.segment = __KERNEL_CS;
    - data.bits.type = GATE_INTERRUPT;
    - data.bits.p = 1;
    + init_idt_data(&data, n, addr);

    idt_setup_from_table(idt_table, &data, 1, false);
    }
    \
     
     \ /
      Last update: 2020-09-10 11:32    [W:4.949 / U:0.364 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site