All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] asm offsets for i386
@ 2003-03-19 23:58 Brian Gerst
  0 siblings, 0 replies; 6+ messages in thread
From: Brian Gerst @ 2003-03-19 23:58 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Linux-Kernel

[-- Attachment #1: Type: text/plain, Size: 128 bytes --]

This patch creates an asm-offsets.c file for i386, and removes the 
hardcoded constants from several files.

--
				Brian Gerst

[-- Attachment #2: asm-offsets-1 --]
[-- Type: text/plain, Size: 6253 bytes --]

diff -urN linux-2.5.65-bk1/arch/i386/kernel/asm-offsets.c linux/arch/i386/kernel/asm-offsets.c
--- linux-2.5.65-bk1/arch/i386/kernel/asm-offsets.c	1969-12-31 19:00:00.000000000 -0500
+++ linux/arch/i386/kernel/asm-offsets.c	2003-03-19 14:59:27.000000000 -0500
@@ -0,0 +1,60 @@
+/*
+ * Generate definitions needed by assembly language modules.
+ * This code generates raw asm output which is post-processed to extract
+ * and format the required data.
+ */
+
+#include <linux/thread_info.h>
+#include <linux/ptrace.h>
+#include <asm/processor.h>
+#include <asm/fixmap.h>
+
+#define DEFINE(sym, val) \
+	asm volatile("\n->" #sym " %0 " #val : : "i" (val))
+
+#define ADDR(sym, val) \
+	asm volatile("\n->" #sym " %0 " #val : : "m" (val))
+
+#define BLANK() asm volatile("\n->" : : )
+
+void foo(void)
+{
+	DEFINE(TI_TASK, offsetof(struct thread_info, task));
+	DEFINE(TI_EXEC_DOMAIN, offsetof(struct thread_info, exec_domain));
+	DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
+	DEFINE(TI_STATUS, offsetof(struct thread_info, status));
+	DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
+	DEFINE(TI_PRE_COUNT, offsetof(struct thread_info, preempt_count));
+	DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit));
+	DEFINE(TI_RESTART_BLOCK, offsetof(struct thread_info, restart_block));
+	BLANK();
+
+	DEFINE(EBX, offsetof(struct pt_regs, ebx));
+	DEFINE(ECX, offsetof(struct pt_regs, ecx));
+	DEFINE(EDX, offsetof(struct pt_regs, edx));
+	DEFINE(ESI, offsetof(struct pt_regs, esi));
+	DEFINE(EDI, offsetof(struct pt_regs, edi));
+	DEFINE(EBP, offsetof(struct pt_regs, ebp));
+	DEFINE(EAX, offsetof(struct pt_regs, eax));
+	DEFINE(DS, offsetof(struct pt_regs, xds));
+	DEFINE(ES, offsetof(struct pt_regs, xes));
+	DEFINE(ORIG_EAX, offsetof(struct pt_regs, orig_eax));
+	DEFINE(EIP, offsetof(struct pt_regs, eip));
+	DEFINE(CS, offsetof(struct pt_regs, xcs));
+	DEFINE(EFLAGS, offsetof(struct pt_regs, eflags));
+	DEFINE(OLDESP, offsetof(struct pt_regs, esp));
+	DEFINE(OLDSS, offsetof(struct pt_regs, xss));
+	BLANK();
+
+	ADDR(X86, new_cpu_data.x86);
+	ADDR(X86_VENDOR, new_cpu_data.x86_vendor);
+	ADDR(X86_MODEL, new_cpu_data.x86_model);
+	ADDR(X86_MASK, new_cpu_data.x86_mask);
+	ADDR(X86_HARD_MATH, new_cpu_data.hard_math);
+	ADDR(X86_CPUID, new_cpu_data.cpuid_level);
+	ADDR(X86_CAPABILITY, new_cpu_data.x86_capability[0]);
+	ADDR(X86_VENDOR_ID, new_cpu_data.x86_vendor_id[0]);
+	BLANK();
+
+	DEFINE(SYSENTER_BASE, __fix_to_virt(FIX_VSYSCALL));
+}
diff -urN linux-2.5.65-bk1/arch/i386/kernel/entry.S linux/arch/i386/kernel/entry.S
--- linux-2.5.65-bk1/arch/i386/kernel/entry.S	2003-03-17 18:04:44.000000000 -0500
+++ linux/arch/i386/kernel/entry.S	2003-03-19 14:13:32.000000000 -0500
@@ -47,24 +47,9 @@
 #include <asm/segment.h>
 #include <asm/smp.h>
 #include <asm/page.h>
+#include <asm/asm_offsets.h>
 #include "irq_vectors.h"
 
-EBX		= 0x00
-ECX		= 0x04
-EDX		= 0x08
-ESI		= 0x0C
-EDI		= 0x10
-EBP		= 0x14
-EAX		= 0x18
-DS		= 0x1C
-ES		= 0x20
-ORIG_EAX	= 0x24
-EIP		= 0x28
-CS		= 0x2C
-EFLAGS		= 0x30
-OLDESP		= 0x34
-OLDSS		= 0x38
-
 CF_MASK		= 0x00000001
 TF_MASK		= 0x00000100
 IF_MASK		= 0x00000200
@@ -231,7 +216,7 @@
 #endif
 
 /* Points to after the "sysenter" instruction in the vsyscall page */
-#define SYSENTER_RETURN 0xffffe010
+#define SYSENTER_RETURN SYSENTER_BASE + 0x10
 
 	# sysenter call handler stub
 ENTRY(sysenter_entry)
diff -urN linux-2.5.65-bk1/arch/i386/kernel/head.S linux/arch/i386/kernel/head.S
--- linux-2.5.65-bk1/arch/i386/kernel/head.S	2003-03-17 18:04:44.000000000 -0500
+++ linux/arch/i386/kernel/head.S	2003-03-19 14:23:43.000000000 -0500
@@ -16,6 +16,7 @@
 #include <asm/pgtable.h>
 #include <asm/desc.h>
 #include <asm/cache.h>
+#include <asm/asm_offsets.h>
 
 #define OLD_CL_MAGIC_ADDR	0x90020
 #define OLD_CL_MAGIC		0xA33F
@@ -24,20 +25,6 @@
 #define NEW_CL_POINTER		0x228	/* Relative to real mode data */
 
 /*
- * References to members of the new_cpu_data structure.
- */
-
-#define CPU_PARAMS	new_cpu_data
-#define X86		CPU_PARAMS+0
-#define X86_VENDOR	CPU_PARAMS+1
-#define X86_MODEL	CPU_PARAMS+2
-#define X86_MASK	CPU_PARAMS+3
-#define X86_HARD_MATH	CPU_PARAMS+6
-#define X86_CPUID	CPU_PARAMS+8
-#define X86_CAPABILITY	CPU_PARAMS+12
-#define X86_VENDOR_ID	CPU_PARAMS+28
-
-/*
  * Initialize page tables
  */
 #define INIT_PAGE_TABLES \
diff -urN linux-2.5.65-bk1/arch/i386/lib/getuser.S linux/arch/i386/lib/getuser.S
--- linux-2.5.65-bk1/arch/i386/lib/getuser.S	2002-12-24 00:19:24.000000000 -0500
+++ linux/arch/i386/lib/getuser.S	2003-03-19 13:18:42.000000000 -0500
@@ -9,6 +9,7 @@
  * return value.
  */
 #include <asm/thread_info.h>
+#include <asm/asm_offsets.h>
 
 
 /*
diff -urN linux-2.5.65-bk1/arch/i386/Makefile linux/arch/i386/Makefile
--- linux-2.5.65-bk1/arch/i386/Makefile	2003-03-17 18:04:43.000000000 -0500
+++ linux/arch/i386/Makefile	2003-03-19 13:18:42.000000000 -0500
@@ -92,6 +92,14 @@
 
 boot := arch/i386/boot
 
+prepare: include/asm-$(ARCH)/asm_offsets.h
+
+arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
+				   include/config/MARKER
+
+include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
+	$(call filechk,gen-asm-offsets)
+
 .PHONY: zImage bzImage compressed zlilo bzlilo \
 	zdisk bzdisk fdimage fdimage144 fdimage288 install
 
@@ -127,4 +135,5 @@
   echo  '  fdimage      - Create a boot floppy image'
 endef
 
-CLEAN_FILES += arch/$(ARCH)/boot/fdimage arch/$(ARCH)/boot/mtools.conf
+CLEAN_FILES += arch/$(ARCH)/boot/fdimage arch/$(ARCH)/boot/mtools.conf \
+	       include/asm-$(ARCH)/asm_offsets.h
diff -urN linux-2.5.65-bk1/include/asm-i386/thread_info.h linux/include/asm-i386/thread_info.h
--- linux-2.5.65-bk1/include/asm-i386/thread_info.h	2003-03-17 18:04:55.000000000 -0500
+++ linux/include/asm-i386/thread_info.h	2003-03-19 13:18:42.000000000 -0500
@@ -38,18 +38,6 @@
 	__u8			supervisor_stack[0];
 };
 
-#else /* !__ASSEMBLY__ */
-
-/* offsets into the thread_info struct for assembly code access */
-#define TI_TASK		0x00000000
-#define TI_EXEC_DOMAIN	0x00000004
-#define TI_FLAGS	0x00000008
-#define TI_STATUS	0x0000000C
-#define TI_CPU		0x00000010
-#define TI_PRE_COUNT	0x00000014
-#define TI_ADDR_LIMIT	0x00000018
-#define TI_RESTART_BLOCK 0x000001C
-
 #endif
 
 #define PREEMPT_ACTIVE		0x4000000

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] asm offsets for i386
  2003-03-27 18:11   ` Brian Gerst
@ 2003-03-27 19:37     ` David S. Miller
  0 siblings, 0 replies; 6+ messages in thread
From: David S. Miller @ 2003-03-27 19:37 UTC (permalink / raw)
  To: Brian Gerst; +Cc: Pete Zaitcev, linux-kernel

On Thu, 2003-03-27 at 10:11, Brian Gerst wrote:
> I already caught one bug with this, since someone recently added values 
> to the feature flags array and didn't fix up the vendor id offset.  What 
> you propose fails with some non-gcc compilers (Intel's compiler for 
> example, which supports gcc extensions) that don't optimize it away.

Too f*ing bad, this kind of debug test already exists in other
places of the kernel.

-- 
David S. Miller <davem@redhat.com>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] asm offsets for i386
  2003-03-27 17:28 ` Pete Zaitcev
@ 2003-03-27 18:11   ` Brian Gerst
  2003-03-27 19:37     ` David S. Miller
  0 siblings, 1 reply; 6+ messages in thread
From: Brian Gerst @ 2003-03-27 18:11 UTC (permalink / raw)
  To: Pete Zaitcev; +Cc: linux-kernel

Pete Zaitcev wrote:
>>[Resend]
>>
>>This patch creates an asm-offsets.c file for i386, and removes the
>>hardcoded constants from several asm files.
>>
>>--
>>				Brian Gerst
> 
> 
> Doesn't seem to be worth the trouble because thread_info
> is a small structure, not embedded into a big structure
> as thread_struct was. DaveM removed the automatic
> offset generation on sparc64 and I am thinking to do
> the same on sparc.
> 
> I'm not surprised that nobody answered, the patch seems
> to be rather pointless.
> 
> We might want to add something like this:
> 
>     if (TI_CPU         != offsetof(struct thread_info, cpu) ||
>         TI_PREEMPT     != offsetof(struct thread_info, preempt_count) ||
>         TI_SOFTIRQ     != offsetof(struct thread_info, softirq_count) ||
>         TI_HARDIRQ     != offsetof(struct thread_info, hardirq_count))
>             thread_info_offsets_are_bolixed_linus();
> 
> It gives out an link time error.
> 
> -- Pete
> 

I already caught one bug with this, since someone recently added values 
to the feature flags array and didn't fix up the vendor id offset.  What 
you propose fails with some non-gcc compilers (Intel's compiler for 
example, which supports gcc extensions) that don't optimize it away.

--
				Brian Gerst


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] asm offsets for i386
       [not found] <mailman.1048773360.3585.linux-kernel2news@redhat.com>
@ 2003-03-27 17:28 ` Pete Zaitcev
  2003-03-27 18:11   ` Brian Gerst
  0 siblings, 1 reply; 6+ messages in thread
From: Pete Zaitcev @ 2003-03-27 17:28 UTC (permalink / raw)
  To: Brian Gerst; +Cc: linux-kernel

> [Resend]
> 
> This patch creates an asm-offsets.c file for i386, and removes the
> hardcoded constants from several asm files.
> 
> --
> 				Brian Gerst

Doesn't seem to be worth the trouble because thread_info
is a small structure, not embedded into a big structure
as thread_struct was. DaveM removed the automatic
offset generation on sparc64 and I am thinking to do
the same on sparc.

I'm not surprised that nobody answered, the patch seems
to be rather pointless.

We might want to add something like this:

    if (TI_CPU         != offsetof(struct thread_info, cpu) ||
        TI_PREEMPT     != offsetof(struct thread_info, preempt_count) ||
        TI_SOFTIRQ     != offsetof(struct thread_info, softirq_count) ||
        TI_HARDIRQ     != offsetof(struct thread_info, hardirq_count))
            thread_info_offsets_are_bolixed_linus();

It gives out an link time error.

-- Pete

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH] asm offsets for i386
@ 2003-03-27 13:51 Brian Gerst
  0 siblings, 0 replies; 6+ messages in thread
From: Brian Gerst @ 2003-03-27 13:51 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Linux-Kernel

[-- Attachment #1: Type: text/plain, Size: 143 bytes --]

[Resend]

This patch creates an asm-offsets.c file for i386, and removes the
hardcoded constants from several asm files.

--
				Brian Gerst



[-- Attachment #2: asm-offsets-1 --]
[-- Type: text/plain, Size: 6253 bytes --]

diff -urN linux-2.5.65-bk1/arch/i386/kernel/asm-offsets.c linux/arch/i386/kernel/asm-offsets.c
--- linux-2.5.65-bk1/arch/i386/kernel/asm-offsets.c	1969-12-31 19:00:00.000000000 -0500
+++ linux/arch/i386/kernel/asm-offsets.c	2003-03-19 14:59:27.000000000 -0500
@@ -0,0 +1,60 @@
+/*
+ * Generate definitions needed by assembly language modules.
+ * This code generates raw asm output which is post-processed to extract
+ * and format the required data.
+ */
+
+#include <linux/thread_info.h>
+#include <linux/ptrace.h>
+#include <asm/processor.h>
+#include <asm/fixmap.h>
+
+#define DEFINE(sym, val) \
+	asm volatile("\n->" #sym " %0 " #val : : "i" (val))
+
+#define ADDR(sym, val) \
+	asm volatile("\n->" #sym " %0 " #val : : "m" (val))
+
+#define BLANK() asm volatile("\n->" : : )
+
+void foo(void)
+{
+	DEFINE(TI_TASK, offsetof(struct thread_info, task));
+	DEFINE(TI_EXEC_DOMAIN, offsetof(struct thread_info, exec_domain));
+	DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
+	DEFINE(TI_STATUS, offsetof(struct thread_info, status));
+	DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
+	DEFINE(TI_PRE_COUNT, offsetof(struct thread_info, preempt_count));
+	DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit));
+	DEFINE(TI_RESTART_BLOCK, offsetof(struct thread_info, restart_block));
+	BLANK();
+
+	DEFINE(EBX, offsetof(struct pt_regs, ebx));
+	DEFINE(ECX, offsetof(struct pt_regs, ecx));
+	DEFINE(EDX, offsetof(struct pt_regs, edx));
+	DEFINE(ESI, offsetof(struct pt_regs, esi));
+	DEFINE(EDI, offsetof(struct pt_regs, edi));
+	DEFINE(EBP, offsetof(struct pt_regs, ebp));
+	DEFINE(EAX, offsetof(struct pt_regs, eax));
+	DEFINE(DS, offsetof(struct pt_regs, xds));
+	DEFINE(ES, offsetof(struct pt_regs, xes));
+	DEFINE(ORIG_EAX, offsetof(struct pt_regs, orig_eax));
+	DEFINE(EIP, offsetof(struct pt_regs, eip));
+	DEFINE(CS, offsetof(struct pt_regs, xcs));
+	DEFINE(EFLAGS, offsetof(struct pt_regs, eflags));
+	DEFINE(OLDESP, offsetof(struct pt_regs, esp));
+	DEFINE(OLDSS, offsetof(struct pt_regs, xss));
+	BLANK();
+
+	ADDR(X86, new_cpu_data.x86);
+	ADDR(X86_VENDOR, new_cpu_data.x86_vendor);
+	ADDR(X86_MODEL, new_cpu_data.x86_model);
+	ADDR(X86_MASK, new_cpu_data.x86_mask);
+	ADDR(X86_HARD_MATH, new_cpu_data.hard_math);
+	ADDR(X86_CPUID, new_cpu_data.cpuid_level);
+	ADDR(X86_CAPABILITY, new_cpu_data.x86_capability[0]);
+	ADDR(X86_VENDOR_ID, new_cpu_data.x86_vendor_id[0]);
+	BLANK();
+
+	DEFINE(SYSENTER_BASE, __fix_to_virt(FIX_VSYSCALL));
+}
diff -urN linux-2.5.65-bk1/arch/i386/kernel/entry.S linux/arch/i386/kernel/entry.S
--- linux-2.5.65-bk1/arch/i386/kernel/entry.S	2003-03-17 18:04:44.000000000 -0500
+++ linux/arch/i386/kernel/entry.S	2003-03-19 14:13:32.000000000 -0500
@@ -47,24 +47,9 @@
 #include <asm/segment.h>
 #include <asm/smp.h>
 #include <asm/page.h>
+#include <asm/asm_offsets.h>
 #include "irq_vectors.h"
 
-EBX		= 0x00
-ECX		= 0x04
-EDX		= 0x08
-ESI		= 0x0C
-EDI		= 0x10
-EBP		= 0x14
-EAX		= 0x18
-DS		= 0x1C
-ES		= 0x20
-ORIG_EAX	= 0x24
-EIP		= 0x28
-CS		= 0x2C
-EFLAGS		= 0x30
-OLDESP		= 0x34
-OLDSS		= 0x38
-
 CF_MASK		= 0x00000001
 TF_MASK		= 0x00000100
 IF_MASK		= 0x00000200
@@ -231,7 +216,7 @@
 #endif
 
 /* Points to after the "sysenter" instruction in the vsyscall page */
-#define SYSENTER_RETURN 0xffffe010
+#define SYSENTER_RETURN SYSENTER_BASE + 0x10
 
 	# sysenter call handler stub
 ENTRY(sysenter_entry)
diff -urN linux-2.5.65-bk1/arch/i386/kernel/head.S linux/arch/i386/kernel/head.S
--- linux-2.5.65-bk1/arch/i386/kernel/head.S	2003-03-17 18:04:44.000000000 -0500
+++ linux/arch/i386/kernel/head.S	2003-03-19 14:23:43.000000000 -0500
@@ -16,6 +16,7 @@
 #include <asm/pgtable.h>
 #include <asm/desc.h>
 #include <asm/cache.h>
+#include <asm/asm_offsets.h>
 
 #define OLD_CL_MAGIC_ADDR	0x90020
 #define OLD_CL_MAGIC		0xA33F
@@ -24,20 +25,6 @@
 #define NEW_CL_POINTER		0x228	/* Relative to real mode data */
 
 /*
- * References to members of the new_cpu_data structure.
- */
-
-#define CPU_PARAMS	new_cpu_data
-#define X86		CPU_PARAMS+0
-#define X86_VENDOR	CPU_PARAMS+1
-#define X86_MODEL	CPU_PARAMS+2
-#define X86_MASK	CPU_PARAMS+3
-#define X86_HARD_MATH	CPU_PARAMS+6
-#define X86_CPUID	CPU_PARAMS+8
-#define X86_CAPABILITY	CPU_PARAMS+12
-#define X86_VENDOR_ID	CPU_PARAMS+28
-
-/*
  * Initialize page tables
  */
 #define INIT_PAGE_TABLES \
diff -urN linux-2.5.65-bk1/arch/i386/lib/getuser.S linux/arch/i386/lib/getuser.S
--- linux-2.5.65-bk1/arch/i386/lib/getuser.S	2002-12-24 00:19:24.000000000 -0500
+++ linux/arch/i386/lib/getuser.S	2003-03-19 13:18:42.000000000 -0500
@@ -9,6 +9,7 @@
  * return value.
  */
 #include <asm/thread_info.h>
+#include <asm/asm_offsets.h>
 
 
 /*
diff -urN linux-2.5.65-bk1/arch/i386/Makefile linux/arch/i386/Makefile
--- linux-2.5.65-bk1/arch/i386/Makefile	2003-03-17 18:04:43.000000000 -0500
+++ linux/arch/i386/Makefile	2003-03-19 13:18:42.000000000 -0500
@@ -92,6 +92,14 @@
 
 boot := arch/i386/boot
 
+prepare: include/asm-$(ARCH)/asm_offsets.h
+
+arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
+				   include/config/MARKER
+
+include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
+	$(call filechk,gen-asm-offsets)
+
 .PHONY: zImage bzImage compressed zlilo bzlilo \
 	zdisk bzdisk fdimage fdimage144 fdimage288 install
 
@@ -127,4 +135,5 @@
   echo  '  fdimage      - Create a boot floppy image'
 endef
 
-CLEAN_FILES += arch/$(ARCH)/boot/fdimage arch/$(ARCH)/boot/mtools.conf
+CLEAN_FILES += arch/$(ARCH)/boot/fdimage arch/$(ARCH)/boot/mtools.conf \
+	       include/asm-$(ARCH)/asm_offsets.h
diff -urN linux-2.5.65-bk1/include/asm-i386/thread_info.h linux/include/asm-i386/thread_info.h
--- linux-2.5.65-bk1/include/asm-i386/thread_info.h	2003-03-17 18:04:55.000000000 -0500
+++ linux/include/asm-i386/thread_info.h	2003-03-19 13:18:42.000000000 -0500
@@ -38,18 +38,6 @@
 	__u8			supervisor_stack[0];
 };
 
-#else /* !__ASSEMBLY__ */
-
-/* offsets into the thread_info struct for assembly code access */
-#define TI_TASK		0x00000000
-#define TI_EXEC_DOMAIN	0x00000004
-#define TI_FLAGS	0x00000008
-#define TI_STATUS	0x0000000C
-#define TI_CPU		0x00000010
-#define TI_PRE_COUNT	0x00000014
-#define TI_ADDR_LIMIT	0x00000018
-#define TI_RESTART_BLOCK 0x000001C
-
 #endif
 
 #define PREEMPT_ACTIVE		0x4000000

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH] asm offsets for i386
@ 2003-03-21 13:50 Brian Gerst
  0 siblings, 0 replies; 6+ messages in thread
From: Brian Gerst @ 2003-03-21 13:50 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Linux-Kernel

[-- Attachment #1: Type: text/plain, Size: 138 bytes --]

[Resend]

This patch creates an asm-offsets.c file for i386, and removes the
hardcoded constants from several files.

--
				Brian Gerst


[-- Attachment #2: asm-offsets-1 --]
[-- Type: text/plain, Size: 6254 bytes --]

diff -urN linux-2.5.65-bk1/arch/i386/kernel/asm-offsets.c linux/arch/i386/kernel/asm-offsets.c
--- linux-2.5.65-bk1/arch/i386/kernel/asm-offsets.c	1969-12-31 19:00:00.000000000 -0500
+++ linux/arch/i386/kernel/asm-offsets.c	2003-03-19 14:59:27.000000000 -0500
@@ -0,0 +1,60 @@
+/*
+ * Generate definitions needed by assembly language modules.
+ * This code generates raw asm output which is post-processed to extract
+ * and format the required data.
+ */
+
+#include <linux/thread_info.h>
+#include <linux/ptrace.h>
+#include <asm/processor.h>
+#include <asm/fixmap.h>
+
+#define DEFINE(sym, val) \
+	asm volatile("\n->" #sym " %0 " #val : : "i" (val))
+
+#define ADDR(sym, val) \
+	asm volatile("\n->" #sym " %0 " #val : : "m" (val))
+
+#define BLANK() asm volatile("\n->" : : )
+
+void foo(void)
+{
+	DEFINE(TI_TASK, offsetof(struct thread_info, task));
+	DEFINE(TI_EXEC_DOMAIN, offsetof(struct thread_info, exec_domain));
+	DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
+	DEFINE(TI_STATUS, offsetof(struct thread_info, status));
+	DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
+	DEFINE(TI_PRE_COUNT, offsetof(struct thread_info, preempt_count));
+	DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit));
+	DEFINE(TI_RESTART_BLOCK, offsetof(struct thread_info, restart_block));
+	BLANK();
+
+	DEFINE(EBX, offsetof(struct pt_regs, ebx));
+	DEFINE(ECX, offsetof(struct pt_regs, ecx));
+	DEFINE(EDX, offsetof(struct pt_regs, edx));
+	DEFINE(ESI, offsetof(struct pt_regs, esi));
+	DEFINE(EDI, offsetof(struct pt_regs, edi));
+	DEFINE(EBP, offsetof(struct pt_regs, ebp));
+	DEFINE(EAX, offsetof(struct pt_regs, eax));
+	DEFINE(DS, offsetof(struct pt_regs, xds));
+	DEFINE(ES, offsetof(struct pt_regs, xes));
+	DEFINE(ORIG_EAX, offsetof(struct pt_regs, orig_eax));
+	DEFINE(EIP, offsetof(struct pt_regs, eip));
+	DEFINE(CS, offsetof(struct pt_regs, xcs));
+	DEFINE(EFLAGS, offsetof(struct pt_regs, eflags));
+	DEFINE(OLDESP, offsetof(struct pt_regs, esp));
+	DEFINE(OLDSS, offsetof(struct pt_regs, xss));
+	BLANK();
+
+	ADDR(X86, new_cpu_data.x86);
+	ADDR(X86_VENDOR, new_cpu_data.x86_vendor);
+	ADDR(X86_MODEL, new_cpu_data.x86_model);
+	ADDR(X86_MASK, new_cpu_data.x86_mask);
+	ADDR(X86_HARD_MATH, new_cpu_data.hard_math);
+	ADDR(X86_CPUID, new_cpu_data.cpuid_level);
+	ADDR(X86_CAPABILITY, new_cpu_data.x86_capability[0]);
+	ADDR(X86_VENDOR_ID, new_cpu_data.x86_vendor_id[0]);
+	BLANK();
+
+	DEFINE(SYSENTER_BASE, __fix_to_virt(FIX_VSYSCALL));
+}
diff -urN linux-2.5.65-bk1/arch/i386/kernel/entry.S linux/arch/i386/kernel/entry.S
--- linux-2.5.65-bk1/arch/i386/kernel/entry.S	2003-03-17 18:04:44.000000000 -0500
+++ linux/arch/i386/kernel/entry.S	2003-03-19 14:13:32.000000000 -0500
@@ -47,24 +47,9 @@
 #include <asm/segment.h>
 #include <asm/smp.h>
 #include <asm/page.h>
+#include <asm/asm_offsets.h>
 #include "irq_vectors.h"
 
-EBX		= 0x00
-ECX		= 0x04
-EDX		= 0x08
-ESI		= 0x0C
-EDI		= 0x10
-EBP		= 0x14
-EAX		= 0x18
-DS		= 0x1C
-ES		= 0x20
-ORIG_EAX	= 0x24
-EIP		= 0x28
-CS		= 0x2C
-EFLAGS		= 0x30
-OLDESP		= 0x34
-OLDSS		= 0x38
-
 CF_MASK		= 0x00000001
 TF_MASK		= 0x00000100
 IF_MASK		= 0x00000200
@@ -231,7 +216,7 @@
 #endif
 
 /* Points to after the "sysenter" instruction in the vsyscall page */
-#define SYSENTER_RETURN 0xffffe010
+#define SYSENTER_RETURN SYSENTER_BASE + 0x10
 
 	# sysenter call handler stub
 ENTRY(sysenter_entry)
diff -urN linux-2.5.65-bk1/arch/i386/kernel/head.S linux/arch/i386/kernel/head.S
--- linux-2.5.65-bk1/arch/i386/kernel/head.S	2003-03-17 18:04:44.000000000 -0500
+++ linux/arch/i386/kernel/head.S	2003-03-19 14:23:43.000000000 -0500
@@ -16,6 +16,7 @@
 #include <asm/pgtable.h>
 #include <asm/desc.h>
 #include <asm/cache.h>
+#include <asm/asm_offsets.h>
 
 #define OLD_CL_MAGIC_ADDR	0x90020
 #define OLD_CL_MAGIC		0xA33F
@@ -24,20 +25,6 @@
 #define NEW_CL_POINTER		0x228	/* Relative to real mode data */
 
 /*
- * References to members of the new_cpu_data structure.
- */
-
-#define CPU_PARAMS	new_cpu_data
-#define X86		CPU_PARAMS+0
-#define X86_VENDOR	CPU_PARAMS+1
-#define X86_MODEL	CPU_PARAMS+2
-#define X86_MASK	CPU_PARAMS+3
-#define X86_HARD_MATH	CPU_PARAMS+6
-#define X86_CPUID	CPU_PARAMS+8
-#define X86_CAPABILITY	CPU_PARAMS+12
-#define X86_VENDOR_ID	CPU_PARAMS+28
-
-/*
  * Initialize page tables
  */
 #define INIT_PAGE_TABLES \
diff -urN linux-2.5.65-bk1/arch/i386/lib/getuser.S linux/arch/i386/lib/getuser.S
--- linux-2.5.65-bk1/arch/i386/lib/getuser.S	2002-12-24 00:19:24.000000000 -0500
+++ linux/arch/i386/lib/getuser.S	2003-03-19 13:18:42.000000000 -0500
@@ -9,6 +9,7 @@
  * return value.
  */
 #include <asm/thread_info.h>
+#include <asm/asm_offsets.h>
 
 
 /*
diff -urN linux-2.5.65-bk1/arch/i386/Makefile linux/arch/i386/Makefile
--- linux-2.5.65-bk1/arch/i386/Makefile	2003-03-17 18:04:43.000000000 -0500
+++ linux/arch/i386/Makefile	2003-03-19 13:18:42.000000000 -0500
@@ -92,6 +92,14 @@
 
 boot := arch/i386/boot
 
+prepare: include/asm-$(ARCH)/asm_offsets.h
+
+arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
+				   include/config/MARKER
+
+include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
+	$(call filechk,gen-asm-offsets)
+
 .PHONY: zImage bzImage compressed zlilo bzlilo \
 	zdisk bzdisk fdimage fdimage144 fdimage288 install
 
@@ -127,4 +135,5 @@
   echo  '  fdimage      - Create a boot floppy image'
 endef
 
-CLEAN_FILES += arch/$(ARCH)/boot/fdimage arch/$(ARCH)/boot/mtools.conf
+CLEAN_FILES += arch/$(ARCH)/boot/fdimage arch/$(ARCH)/boot/mtools.conf \
+	       include/asm-$(ARCH)/asm_offsets.h
diff -urN linux-2.5.65-bk1/include/asm-i386/thread_info.h linux/include/asm-i386/thread_info.h
--- linux-2.5.65-bk1/include/asm-i386/thread_info.h	2003-03-17 18:04:55.000000000 -0500
+++ linux/include/asm-i386/thread_info.h	2003-03-19 13:18:42.000000000 -0500
@@ -38,18 +38,6 @@
 	__u8			supervisor_stack[0];
 };
 
-#else /* !__ASSEMBLY__ */
-
-/* offsets into the thread_info struct for assembly code access */
-#define TI_TASK		0x00000000
-#define TI_EXEC_DOMAIN	0x00000004
-#define TI_FLAGS	0x00000008
-#define TI_STATUS	0x0000000C
-#define TI_CPU		0x00000010
-#define TI_PRE_COUNT	0x00000014
-#define TI_ADDR_LIMIT	0x00000018
-#define TI_RESTART_BLOCK 0x000001C
-
 #endif
 
 #define PREEMPT_ACTIVE		0x4000000


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2003-03-27 19:26 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-03-19 23:58 [PATCH] asm offsets for i386 Brian Gerst
2003-03-21 13:50 Brian Gerst
2003-03-27 13:51 Brian Gerst
     [not found] <mailman.1048773360.3585.linux-kernel2news@redhat.com>
2003-03-27 17:28 ` Pete Zaitcev
2003-03-27 18:11   ` Brian Gerst
2003-03-27 19:37     ` David S. Miller

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.