Skip to content

Commit

Permalink
x86/vdso: Change the PER_CPU segment to use struct desc_struct
Browse files Browse the repository at this point in the history
This makes it easier to see what's going on.  It produces
exactly the same segment descriptor as the old code.

Signed-off-by: Andy Lutomirski <luto@amacapital.net>
Link: http://lkml.kernel.org/r/d492f7b55136cbc60f016adae79160707b2e03b7.1411494540.git.luto@amacapital.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
  • Loading branch information
Andy Lutomirski authored and Ingo Molnar committed Oct 28, 2014
1 parent d4f829d commit 2588015
Showing 1 changed file with 12 additions and 7 deletions.
19 changes: 12 additions & 7 deletions arch/x86/vdso/vma.c
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ __setup("vdso=", vdso_setup);
*/
static void vsyscall_set_cpu(int cpu)
{
unsigned long d;
struct desc_struct d;
unsigned long node = 0;
#ifdef CONFIG_NUMA
node = cpu_to_node(cpu);
Expand All @@ -257,13 +257,18 @@ static void vsyscall_set_cpu(int cpu)
write_rdtscp_aux((node << 12) | cpu);

/*
* Store cpu number in limit so that it can be loaded quickly
* in user space in vgetcpu. (12 bits for the CPU and 8 bits for the node)
* Store cpu number in limit so that it can be loaded
* quickly in user space in vgetcpu. (12 bits for the CPU
* and 8 bits for the node)
*/
d = 0x0f40000000000ULL;
d |= cpu;
d |= (node & 0xf) << 12;
d |= (node >> 4) << 48;
d = (struct desc_struct) {
.limit0 = cpu | ((node & 0xf) << 12),
.limit = node >> 4,
.type = 4, /* RO data, expand down */
.dpl = 3, /* Visible to user code */
.s = 1, /* Not a system segment */
.p = 1, /* Present */
};

write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_PER_CPU, &d, DESCTYPE_S);
}
Expand Down

0 comments on commit 2588015

Please sign in to comment.