lkml.org 
[lkml]   [2008]   [Apr]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[RFC patch 12/27] Immediate Values - x86 Optimization
    x86 optimization of the immediate values which uses a movl with code patching
    to set/unset the value used to populate the register used as variable source.

    Note : a movb needs to get its value froma =q constraint.

    Quoting "H. Peter Anvin" <hpa@zytor.com>

    Using =r for single-byte values is incorrect for 32-bit code -- that would
    permit %spl, %bpl, %sil, %dil which are illegal in 32-bit mode.

    Changelog:
    - Use text_poke_early with cr0 WP save/restore to patch the bypass. We are doing
    non atomic writes to a code region only touched by us (nobody can execute it
    since we are protected by the imv_mutex).
    - Put imv_set and _imv_set in the architecture independent header.
    - Use $0 instead of %2 with (0) operand.
    - Add x86_64 support, ready for i386+x86_64 -> x86 merge.
    - Use asm-x86/asm.h.
    - Bugfix : 8 bytes 64 bits immediate value was declared as "4 bytes" in the
    immediate structure.
    - Change the immediate.c update code to support variable length opcodes.
    - Vastly simplified, using a busy looping IPI with interrupts disabled.
    Does not protect against NMI nor MCE.
    - Pack the __imv section. Use smallest types required for size (char).
    - Use imv_* instead of immediate_*.

    Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
    CC: Andi Kleen <ak@muc.de>
    CC: "H. Peter Anvin" <hpa@zytor.com>
    CC: Chuck Ebbert <cebbert@redhat.com>
    CC: Christoph Hellwig <hch@infradead.org>
    CC: Jeremy Fitzhardinge <jeremy@goop.org>
    CC: Thomas Gleixner <tglx@linutronix.de>
    CC: Ingo Molnar <mingo@redhat.com>
    CC: Rusty Russell <rusty@rustcorp.com.au>
    CC: Adrian Bunk <bunk@stusta.de>
    CC: akpm@osdl.org
    ---
    arch/x86/Kconfig | 1
    include/asm-x86/immediate.h | 77 ++++++++++++++++++++++++++++++++++++++++++++
    2 files changed, 78 insertions(+)

    Index: linux-2.6-sched-devel/include/asm-x86/immediate.h
    ===================================================================
    --- /dev/null 1970-01-01 00:00:00.000000000 +0000
    +++ linux-2.6-sched-devel/include/asm-x86/immediate.h 2008-04-16 11:16:32.000000000 -0400
    @@ -0,0 +1,77 @@
    +#ifndef _ASM_X86_IMMEDIATE_H
    +#define _ASM_X86_IMMEDIATE_H
    +
    +/*
    + * Immediate values. x86 architecture optimizations.
    + *
    + * (C) Copyright 2006 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
    + *
    + * This file is released under the GPLv2.
    + * See the file COPYING for more details.
    + */
    +
    +#include <asm/asm.h>
    +
    +/**
    + * imv_read - read immediate variable
    + * @name: immediate value name
    + *
    + * Reads the value of @name.
    + * Optimized version of the immediate.
    + * Do not use in __init and __exit functions. Use _imv_read() instead.
    + * If size is bigger than the architecture long size, fall back on a memory
    + * read.
    + *
    + * Make sure to populate the initial static 64 bits opcode with a value
    + * what will generate an instruction with 8 bytes immediate value (not the REX.W
    + * prefixed one that loads a sign extended 32 bits immediate value in a r64
    + * register).
    + */
    +#define imv_read(name) \
    + ({ \
    + __typeof__(name##__imv) value; \
    + BUILD_BUG_ON(sizeof(value) > 8); \
    + switch (sizeof(value)) { \
    + case 1: \
    + asm(".section __imv,\"a\",@progbits\n\t" \
    + _ASM_PTR "%c1, (3f)-%c2\n\t" \
    + ".byte %c2\n\t" \
    + ".previous\n\t" \
    + "mov $0,%0\n\t" \
    + "3:\n\t" \
    + : "=q" (value) \
    + : "i" (&name##__imv), \
    + "i" (sizeof(value))); \
    + break; \
    + case 2: \
    + case 4: \
    + asm(".section __imv,\"a\",@progbits\n\t" \
    + _ASM_PTR "%c1, (3f)-%c2\n\t" \
    + ".byte %c2\n\t" \
    + ".previous\n\t" \
    + "mov $0,%0\n\t" \
    + "3:\n\t" \
    + : "=r" (value) \
    + : "i" (&name##__imv), \
    + "i" (sizeof(value))); \
    + break; \
    + case 8: \
    + if (sizeof(long) < 8) { \
    + value = name##__imv; \
    + break; \
    + } \
    + asm(".section __imv,\"a\",@progbits\n\t" \
    + _ASM_PTR "%c1, (3f)-%c2\n\t" \
    + ".byte %c2\n\t" \
    + ".previous\n\t" \
    + "mov $0xFEFEFEFE01010101,%0\n\t" \
    + "3:\n\t" \
    + : "=r" (value) \
    + : "i" (&name##__imv), \
    + "i" (sizeof(value))); \
    + break; \
    + }; \
    + value; \
    + })
    +
    +#endif /* _ASM_X86_IMMEDIATE_H */
    Index: linux-2.6-sched-devel/arch/x86/Kconfig
    ===================================================================
    --- linux-2.6-sched-devel.orig/arch/x86/Kconfig 2008-04-16 11:07:19.000000000 -0400
    +++ linux-2.6-sched-devel/arch/x86/Kconfig 2008-04-16 11:16:50.000000000 -0400
    @@ -25,6 +25,7 @@ config X86
    select HAVE_KRETPROBES
    select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64)
    select HAVE_ARCH_KGDB
    + select HAVE_IMMEDIATE


    config GENERIC_LOCKBREAK
    --
    Mathieu Desnoyers
    Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
    OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68


    \
     
     \ /
      Last update: 2008-04-16 23:47    [W:0.040 / U:58.856 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site