From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
To: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org,
Andi Kleen <andi@firstfloor.org>,
pageexec@freemail.hu
Subject: Re: [patch 05/10] Text Edit Lock - Alternative code for i386 and x86_64
Date: Fri, 7 Sep 2007 10:09:42 -0400 [thread overview]
Message-ID: <20070907140942.GF9735@Krystal> (raw)
In-Reply-To: <20070907084315.GA28915@in.ibm.com>
* Ananth N Mavinakayanahalli (ananth@in.ibm.com) wrote:
> On Thu, Sep 06, 2007 at 04:01:29PM -0400, Mathieu Desnoyers wrote:
>
> <snip>
>
> > Index: linux-2.6-lttng/arch/i386/kernel/alternative.c
> > ===================================================================
> > --- linux-2.6-lttng.orig/arch/i386/kernel/alternative.c 2007-09-06 14:32:11.000000000 -0400
> > +++ linux-2.6-lttng/arch/i386/kernel/alternative.c 2007-09-06 14:59:19.000000000 -0400
> > @@ -16,6 +16,99 @@
> > #ifdef CONFIG_HOTPLUG_CPU
> > static int smp_alt_once;
> >
> > +/*
> > + * Warning:
> > + * When you use this code to patch more than one byte of an instruction
> > + * you need to make sure that other CPUs cannot execute this code in parallel.
> > + * Also no thread must be currently preempted in the middle of these
> > + * instructions. And on the local CPU you need to be protected again NMI or MCE
> > + * handlers seeing an inconsistent instruction while you patch.
> > + * Warning: read_cr0 is modified by paravirt, this is why we have _early
> > + * versions. They are not in the __init section because they can be used at
> > + * module load time.
> > + */
> > +static inline void text_sync(void *addr, size_t len)
> > +{
> > + void *faddr;
> > +
> > + sync_core();
> > + /* Not strictly needed, but can speed CPU recovery up. */
> > + if (cpu_has_clflush)
> > + for (faddr = addr; faddr < addr + len;
> > + faddr += boot_cpu_data.x86_clflush_size)
> > + asm("clflush (%0) " :: "r" (faddr) : "memory");
> > +}
> > +
> > +void * text_poke_early(void *addr, const void *opcode,
> > + size_t len)
> > +{
> > + memcpy(addr, opcode, len);
> > + text_sync(addr, len);
> > + return addr;
> > +}
> > +
> > +void * text_set_early(void *addr, int c, size_t len)
> > +{
> > + memset(addr, c, len);
> > + text_sync(addr, len);
> > + return addr;
> > +}
> > +
> > +/*
> > + * Only atomic text poke/set should be allowed when not doing early patching.
> > + * It means the size must be writable atomically and the address must be aligned
> > + * in a way that permits an atomic write.
> > + */
> > +void * __kprobes text_poke(void *addr, const void *opcode, size_t len)
> > +{
> > + unsigned long cr0;
> > + int unaligned;
> > +
> > + if (len > sizeof(long)) {
> > + printk(KERN_ERR "text_poke of len %zu too big (max %lu)\n",
> > + len, sizeof(long));
> > + BUG_ON(1);
> > + }
> > + unaligned = (((long)addr + len - 1) & ~(sizeof(long) - 1))
> > + - ((long)addr & ~(sizeof(long) - 1));
> > + if (unlikely(unaligned)) {
> > + printk(KERN_ERR "text_poke of at addr %p of len %zu is "
> > + "unaligned (%d)\n",
> > + addr, len, unaligned);
> > + BUG_ON(1);
> > + }
> > + kernel_wp_save(cr0);
> > + memcpy(addr, opcode, len);
> > + kernel_wp_restore(cr0);
> > + text_sync(addr, len);
> > + return addr;
> > +}
> > +
> > +void * __kprobes text_set(void *addr, int c, size_t len)
> > +{
> > + unsigned long cr0;
> > + int unaligned;
> > +
> > + if (len > sizeof(long)) {
> > + printk(KERN_ERR "text_set of len %zu too big (max %lu)\n",
> > + len, sizeof(long));
> > + BUG_ON(1);
> > + }
> > + unaligned = (((long)addr + len - 1) & ~(sizeof(long) - 1))
> > + - ((long)addr & ~(sizeof(long) - 1));
> > + if (unlikely(unaligned)) {
> > + printk(KERN_ERR "text_set of at addr %p of len %zu is "
> > + "unaligned (%d)\n",
> > + addr, len, unaligned);
> > + BUG_ON(1);
> > + }
> > + kernel_wp_save(cr0);
> > + memset(addr, c, len);
> > + kernel_wp_restore(cr0);
> > + text_sync(addr, len);
> > + return addr;
> > +}
> > +
>
> The above chunk is within ifdef CONFIG_HOTPLUG_CPU. This breaks a CONFIG_SMP=n
> build:
>
> CHK include/linux/compile.h
> UPD include/linux/compile.h
> arch/i386/kernel/built-in.o: In function `apply_alternatives':
> /home/ananth/kprobes/marker/linux-2.6.23-rc4/arch/i386/kernel/alternative.c:293:
> undefined reference to `text_poke_early'
> arch/i386/kernel/built-in.o: In function `arch_disarm_kprobe':
> /home/ananth/kprobes/marker/linux-2.6.23-rc4/arch/i386/kernel/kprobes.c:185:
> undefined reference to `text_set'
> arch/i386/kernel/built-in.o: In function `arch_arm_kprobe':
> /home/ananth/kprobes/marker/linux-2.6.23-rc4/arch/i386/kernel/kprobes.c:180:
> undefined reference to `text_set'
> make: *** [.tmp_vmlinux1] Error 1
>
> Ananth
Thanks, fixing for next release.
--
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
next prev parent reply other threads:[~2007-09-07 14:09 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-09-06 20:01 [patch 00/10] Text Edit Lock for 2.6.23-rc4-mm1 Mathieu Desnoyers
2007-09-06 20:01 ` [patch 01/10] Kprobes - use a mutex to protect the instruction pages list Mathieu Desnoyers
2007-09-06 20:01 ` [patch 02/10] Kprobes - do not use kprobes mutex in arch code Mathieu Desnoyers
2007-09-06 20:01 ` [patch 03/10] Kprobes - declare kprobe_mutex static Mathieu Desnoyers
2007-09-06 20:01 ` [patch 04/10] Text Edit Lock - Architecture Independent Code Mathieu Desnoyers
2007-09-06 20:01 ` [patch 05/10] Text Edit Lock - Alternative code for i386 and x86_64 Mathieu Desnoyers
2007-09-07 6:59 ` Andi Kleen
2007-09-07 14:04 ` Mathieu Desnoyers
2007-09-07 22:35 ` Andi Kleen
2007-09-11 19:59 ` Mathieu Desnoyers
2007-09-07 8:43 ` Ananth N Mavinakayanahalli
2007-09-07 14:09 ` Mathieu Desnoyers [this message]
2007-09-06 20:01 ` [patch 06/10] Text Edit Lock - kprobes architecture independent support Mathieu Desnoyers
2007-09-07 10:28 ` Ananth N Mavinakayanahalli
2007-09-07 14:13 ` Mathieu Desnoyers
2007-09-06 20:01 ` [patch 07/10] Text Edit Lock - kprobes i386 Mathieu Desnoyers
2007-09-06 20:01 ` [patch 08/10] Text Edit Lock - kprobes x86_64 Mathieu Desnoyers
2007-09-06 20:01 ` [patch 09/10] Text Edit Lock - i386 standardize debug rodata Mathieu Desnoyers
2007-09-06 20:01 ` [patch 10/10] Text Edit Lock - x86_64 " Mathieu Desnoyers
-- strict thread matches above, loose matches on Subject: below --
2007-08-27 15:56 [patch 00/10] Text Edit Lock Mathieu Desnoyers
2007-08-27 15:56 ` [patch 05/10] Text Edit Lock - Alternative code for i386 and x86_64 Mathieu Desnoyers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070907140942.GF9735@Krystal \
--to=mathieu.desnoyers@polymtl.ca \
--cc=akpm@linux-foundation.org \
--cc=ananth@in.ibm.com \
--cc=andi@firstfloor.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pageexec@freemail.hu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.