![Jeremy Fitzhardinge](/assets/img/avatar_default.png)
Currently x86 (similar to x84-64) has a special per-cpu structure called "i386_pda" which can be easily and efficiently referenced via the %fs register. An ELF section is more flexible than a structure, allowing any piece of code to use this area. Indeed, such a section already exists: the per-cpu area. So this patch: (1) Removes the PDA and uses per-cpu variables for each current member. (2) Replaces the __KERNEL_PDA segment with __KERNEL_PERCPU. (3) Creates a per-cpu mirror of __per_cpu_offset called this_cpu_off, which can be used to calculate addresses for this CPU's variables. (4) Simplifies startup, because %fs doesn't need to be loaded with a special segment at early boot; it can be deferred until the first percpu area is allocated (or never for UP). The result is less code and one less x86-specific concept. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com> Signed-off-by: Andi Kleen <ak@suse.de> Cc: Andi Kleen <ak@suse.de>
30 lines
613 B
C
30 lines
613 B
C
/*
|
|
* Per-cpu current frame pointer - the location of the last exception frame on
|
|
* the stack, stored in the per-cpu area.
|
|
*
|
|
* Jeremy Fitzhardinge <jeremy@goop.org>
|
|
*/
|
|
#ifndef _ASM_I386_IRQ_REGS_H
|
|
#define _ASM_I386_IRQ_REGS_H
|
|
|
|
#include <asm/percpu.h>
|
|
|
|
DECLARE_PER_CPU(struct pt_regs *, irq_regs);
|
|
|
|
static inline struct pt_regs *get_irq_regs(void)
|
|
{
|
|
return x86_read_percpu(irq_regs);
|
|
}
|
|
|
|
static inline struct pt_regs *set_irq_regs(struct pt_regs *new_regs)
|
|
{
|
|
struct pt_regs *old_regs;
|
|
|
|
old_regs = get_irq_regs();
|
|
x86_write_percpu(irq_regs, new_regs);
|
|
|
|
return old_regs;
|
|
}
|
|
|
|
#endif /* _ASM_I386_IRQ_REGS_H */
|