x86 transition to 4k stacks (1/3)
RFC PATCH 1/1 x86 transition to 4k stacks (1/3)
* clean thread info infrastructure (1/3)
- take out all instances of things like (8191&addr) to get current stack address.
Signature · 2 lines
Dave Hansen [email protected]
# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas:
# ChangeSet 1.850 -> 1.851
# arch/i386/kernel/head.S 1.17 -> 1.18
# include/asm-i386/thread_info.h 1.7 -> 1.8
# include/asm-i386/page.h 1.19 -> 1.20
# arch/i386/kernel/entry.S 1.37 -> 1.38
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/10/14 haveblue@elm3b96.(none) 1.851
# thread_info_cleanup-2.patch # -------------------------------------------- # diff -Nru a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S --- a/arch/i386/kernel/entry.S Mon Oct 14 19:53:55 2002 +++ b/arch/i386/kernel/entry.S Mon Oct 14 19:53:55 2002 @@ -136,7 +136,7 @@ movl %ecx,CS(%esp) # movl %esp, %ebx pushl %ebx - andl $-8192, %ebx # GET_THREAD_INFO + GET_THREAD_INFO_WITH_ESP(%ebx) # GET_THREAD_INFO movl TI_EXEC_DOMAIN(%ebx), %edx # Get the execution domain movl 4(%edx), %edx # Get the lcall7 handler for the domain pushl $0x7 @@ -158,7 +158,7 @@ movl %ecx,CS(%esp) # movl %esp, %ebx pushl %ebx - andl $-8192, %ebx # GET_THREAD_INFO + GET_THREAD_INFO_WITH_ESP(%ebx) # GET_THREAD_INFO movl TI_EXEC_DOMAIN(%ebx), %edx # Get the execution domain movl 4(%edx), %edx # Get the lcall7 handler for the domain pushl $0x27 diff -Nru a/arch/i386/kernel/head.S b/arch/i386/kernel/head.S --- a/arch/i386/kernel/head.S Mon Oct 14 19:53:55 2002 +++ b/arch/i386/kernel/head.S Mon Oct 14 19:53:55 2002 @@ -15,6 +15,7 @@ #include <asm/page.h> #include <asm/pgtable.h> #include <asm/desc.h> +#include <asm/thread_info.h>
#define OLD_CL_MAGIC_ADDR 0x90020
#define OLD_CL_MAGIC 0xA33F
@@ -305,7 +306,7 @@
ret
ENTRY(stack_start)
- .long init_thread_union+8192
+ .long init_thread_union+THREAD_SIZE
.long __KERNEL_DS
/* This is the default interrupt "handler" :-) */
include/asm-i386/page.h +5 -1
@@ -3,7 +3,11 @@/* PAGE_SHIFT determines the page size */ #define PAGE_SHIFT 12 -#define PAGE_SIZE (1UL << PAGE_SHIFT) +#ifndef __ASSEMBLY__ +#define PAGE_SIZE (1UL << PAGE_SHIFT) +#else +#define PAGE_SIZE (1 << PAGE_SHIFT) +#endif #define PAGE_MASK (~(PAGE_SIZE-1))#define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1))
include/asm-i386/thread_info.h +21 -11
@@ -9,6 +9,7 @@#ifdef __KERNEL__ +#include <asm/page.h> #ifndef __ASSEMBLY__#include <asm/processor.h> #endif
@@ -54,10 +55,13 @@* * preempt_count needs to be 1 initially, until the scheduler is functional. */ +#define THREAD_ORDER 1 +#define INIT_THREAD_SIZE THREAD_SIZE +#ifndef __ASSEMBLY__#define INIT_THREAD_INFO (tsk) \ { \ - .task = &tsk, \ + .task = &tsk, \ .exec_domain = &default_exec_domain, \ .flags = 0, \ .cpu = 0, \
@@ -68,30 +72,36 @@#define init_thread_info (init_thread_union.thread_info)#define init_stack (init_thread_union.stack) +/* thread information allocation */ +#define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER) +#define alloc_thread_info () ((struct thread_info *) __get_free_pages(GFP_KERNEL,THREAD_ORDER)) +#define free_thread_info (ti) free_pages((unsigned long) (ti), THREAD_ORDER) +#define get_thread_info (ti) get_task_struct((ti)->task) +#define put_thread_info (ti) put_task_struct((ti)->task) +/* how to get the thread information struct from C */ static inline struct thread_info *current_thread_info (void ) {struct thread_info *ti; - __asm__("andl %%esp,%0; " :"=r" (ti) :"0" (~8191UL )); + __asm__("andl %%esp,%0; " :"=r" (ti) :"0" (~(THREAD_SIZE -1 )));return ti; } -/* thread information allocation */ -#define THREAD_SIZE (2*PAGE_SIZE) -#define alloc_thread_info () ((struct thread_info *) __get_free_pages(GFP_KERNEL,1)) -#define free_thread_info (ti) free_pages((unsigned long) (ti), 1) -#define get_thread_info (ti) get_task_struct((ti)->task) -#define put_thread_info (ti) put_task_struct((ti)->task) -#else /* !__ASSEMBLY__ */ +#define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER) +/* how to get the thread information struct from ASM */ #define GET_THREAD_INFO (reg) \ - movl $-8192, reg; \ + movl $-THREAD_SIZE, reg; \ andl %esp, reg -#endif +/* use this one if reg already contains %esp */ +#define GET_THREAD_INFO_WITH_ESP (reg) \ + andl $-THREAD_SIZE, reg +#endif +/* * thread information flags * - these are process state flags that various assembly files may need to access