All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Campbell <jon@nerdgrounds.com>
To: linux-kernel@vger.kernel.org
Subject: [PATCH] Patches for tiny 386 kernels, again. Linux kernel 2.6.22.7
Date: Mon, 24 Sep 2007 01:51:17 -0700	[thread overview]
Message-ID: <46F77A85.6020202@nerdgrounds.com> (raw)

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

Sorry for the long delay, been very busy since I last posted the 386 
kernel patches back in July.
Now that I have more free time I remade the patches in a cleaner manner, 
broken down into
smaller patches, with fewer #ifdefs all over the place. most #ifdefs are 
in the include/asm-i386 headers
now.

linux-2.6.22.7-embedded-disable-rdtsc.patch:
    * Allows you to remove Pentium TSC register-based timing, which 
would never be used on
       a kernel targeting 386 and 486 boxes exclusively. Apparently 
there is already a
       CONFIG_X86_TSC out there, this patch makes it work as a means to 
disable TSC support
       entirely. Depends on CONFIG_EMBEDDED.

linux-2.6.22.7-embedded-dmi-disable-option.patch:
    * Allows you to remove DMI (Desktop Management Interface) parsing. 
Older computers do
       not have DMI structures in the BIOS, on these computers the DMI 
code is a waste of space.
       In my tests with applying this patch and disabling DMI removes 
6KB from
       arch/i386/boot/bzImage after compile. Apparently there is already 
a CONFIG_DMI out there,
       and #ifdef's in some parts to check this, so all this patch does 
is make CONFIG_DMI visible
       from "make menuconfig" while patching up other parts (like ACPI) 
that simply assume DMI
       functions are there. Depends on CONFIG_EMBEDDED.



[-- Attachment #2: linux-2.6.22.7-embedded-dmi-disable-option.patch --]
[-- Type: text/plain, Size: 4340 bytes --]

diff -u -r linux-2.6.22.7-old/arch/i386/Kconfig linux-2.6.22.7/arch/i386/Kconfig
--- linux-2.6.22.7-old/arch/i386/Kconfig	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/arch/i386/Kconfig	2007-09-23 19:40:15.000000000 +0000
@@ -83,10 +83,6 @@
 	bool
 	default y
 
-config DMI
-	bool
-	default y
-
 source "init/Kconfig"
 
 menu "Processor type and features"
@@ -395,6 +391,19 @@
           XFree86 to initialize some video cards via BIOS. Disabling this
           option saves about 6k.
 
+config DMI
+	default y
+	bool "Enable DMI support" if EMBEDDED
+	depends on X86
+	help
+	  This enables support for processing the Desktop Management
+	  Interface structures present in most modern BIOSes. If you are
+	  building a kernel for an older Pentium, 486, or 386 system and
+	  memory is tight, you can disable this to help reduce the size
+	  of your kernel by about 6K.
+	  
+	  If unsure, say Y
+
 config TOSHIBA
 	tristate "Toshiba Laptop support"
 	---help---
diff -u -r linux-2.6.22.7-old/arch/i386/kernel/acpi/boot.c linux-2.6.22.7/arch/i386/kernel/acpi/boot.c
--- linux-2.6.22.7-old/arch/i386/kernel/acpi/boot.c	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/arch/i386/kernel/acpi/boot.c	2007-09-23 19:37:12.000000000 +0000
@@ -891,6 +891,7 @@
 	return 0;
 }
 
+#ifdef CONFIG_DMI
 static int __init dmi_disable_acpi(struct dmi_system_id *d)
 {
 	if (!acpi_force) {
@@ -1097,6 +1098,7 @@
 	 },
 	{}
 };
+#endif /* CONFIG_DMI */
 
 #endif				/* __i386__ */
 
@@ -1127,7 +1129,7 @@
 {
 	int error;
 
-#ifdef __i386__
+#if defined(__i386__) && defined(CONFIG_DMI)
 	dmi_check_system(acpi_dmi_table);
 #endif
 
diff -u -r linux-2.6.22.7-old/arch/i386/kernel/acpi/sleep.c linux-2.6.22.7/arch/i386/kernel/acpi/sleep.c
--- linux-2.6.22.7-old/arch/i386/kernel/acpi/sleep.c	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/arch/i386/kernel/acpi/sleep.c	2007-09-23 19:36:07.000000000 +0000
@@ -86,6 +86,7 @@
 	return 0;
 }
 
+#ifdef CONFIG_DMI
 static __initdata struct dmi_system_id acpisleep_dmi_table[] = {
 	{			/* Reset video mode after returning from ACPI S3 sleep */
 	 .callback = reset_videomode_after_s3,
@@ -104,3 +105,5 @@
 }
 
 core_initcall(acpisleep_dmi_init);
+#endif
+
diff -u -r linux-2.6.22.7-old/arch/i386/kernel/setup.c linux-2.6.22.7/arch/i386/kernel/setup.c
--- linux-2.6.22.7-old/arch/i386/kernel/setup.c	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/arch/i386/kernel/setup.c	2007-09-23 19:30:59.000000000 +0000
@@ -611,7 +611,9 @@
 	 * NOTE: at this point the bootmem allocator is fully available.
 	 */
 
+#ifdef CONFIG_DMI
 	dmi_scan_machine();
+#endif
 
 #ifdef CONFIG_X86_GENERICARCH
 	generic_apic_probe();
diff -u -r linux-2.6.22.7-old/arch/i386/kernel/tsc.c linux-2.6.22.7/arch/i386/kernel/tsc.c
--- linux-2.6.22.7-old/arch/i386/kernel/tsc.c	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/arch/i386/kernel/tsc.c	2007-09-23 19:36:37.000000000 +0000
@@ -290,6 +290,7 @@
 }
 EXPORT_SYMBOL_GPL(mark_tsc_unstable);
 
+#ifdef CONFIG_DMI
 static int __init dmi_mark_tsc_unstable(struct dmi_system_id *d)
 {
 	printk(KERN_NOTICE "%s detected: marking TSC unstable.\n",
@@ -310,6 +311,7 @@
 	 },
 	 {}
 };
+#endif
 
 /*
  * Make an educated guess if the TSC is trustworthy and synchronized
@@ -369,8 +371,10 @@
 	set_cyc2ns_scale(cpu_khz);
 	use_tsc_delay();
 
+#ifdef CONFIG_DMI
 	/* Check and install the TSC clocksource */
 	dmi_check_system(bad_tsc_dmi_table);
+#endif
 
 	unsynchronized_tsc();
 	check_geode_tsc_reliable();
diff -u -r linux-2.6.22.7-old/drivers/acpi/Kconfig linux-2.6.22.7/drivers/acpi/Kconfig
--- linux-2.6.22.7-old/drivers/acpi/Kconfig	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/drivers/acpi/Kconfig	2007-09-23 19:48:07.000000000 +0000
@@ -263,6 +263,7 @@
 
 config ACPI_BLACKLIST_YEAR
 	int "Disable ACPI for systems before Jan 1st this year" if X86_32
+	depends on DMI
 	default 0
 	help
 	  enter a 4-digit year, eg. 2001 to disable ACPI by default
diff -u -r linux-2.6.22.7-old/drivers/acpi/osl.c linux-2.6.22.7/drivers/acpi/osl.c
--- linux-2.6.22.7-old/drivers/acpi/osl.c	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/drivers/acpi/osl.c	2007-09-23 19:24:27.000000000 +0000
@@ -139,7 +139,9 @@
 
 acpi_status __init acpi_os_initialize(void)
 {
+#ifdef CONFIG_DMI
 	dmi_check_system(acpi_osl_dmi_table);
+#endif
 	return AE_OK;
 }
 

[-- Attachment #3: linux-2.6.22.7-embedded-disable-rdtsc.patch --]
[-- Type: text/plain, Size: 8390 bytes --]

diff -u -r linux-2.6.22.7-old/arch/i386/Kconfig linux-2.6.22.7/arch/i386/Kconfig
--- linux-2.6.22.7-old/arch/i386/Kconfig	2007-09-23 20:44:10.000000000 +0000
+++ linux-2.6.22.7/arch/i386/Kconfig	2007-09-23 22:15:57.000000000 +0000
@@ -362,6 +362,18 @@
 	  to disable it.  MCE support simply ignores non-MCE processors like
 	  the 386 and 486, so nearly everyone can say Y here.
 
+config X86_TSC
+	bool "Use TSC as time source" if EMBEDDED
+	depends on X86
+	default y
+	help
+	  Uses the TSC (time stamp counter) in Pentium and newer systems as a
+	  high resolution timer. If you are compiling a kernel for older 386
+	  and 486 systems that do not have this counter, you can say N here
+	  to help reduce the size of your kernel.
+	  
+	  If unsure, say Y.
+
 config X86_MCE_NONFATAL
 	tristate "Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4"
 	depends on X86_MCE
diff -u -r linux-2.6.22.7-old/arch/i386/kernel/Makefile linux-2.6.22.7/arch/i386/kernel/Makefile
--- linux-2.6.22.7-old/arch/i386/kernel/Makefile	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/arch/i386/kernel/Makefile	2007-09-23 22:17:36.000000000 +0000
@@ -7,8 +7,9 @@
 obj-y	:= process.o signal.o entry.o traps.o irq.o \
 		ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \
 		pci-dma.o i386_ksyms.o i387.o bootflag.o e820.o\
-		quirks.o i8237.o topology.o alternative.o i8253.o tsc.o
+		quirks.o i8237.o topology.o alternative.o i8253.o
 
+obj-$(CONFIG_X86_TSC)		+= tsc.o
 obj-$(CONFIG_STACKTRACE)	+= stacktrace.o
 obj-y				+= cpu/
 obj-y				+= acpi/
diff -u -r linux-2.6.22.7-old/arch/i386/kernel/cpu/amd.c linux-2.6.22.7/arch/i386/kernel/cpu/amd.c
--- linux-2.6.22.7-old/arch/i386/kernel/cpu/amd.c	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/arch/i386/kernel/cpu/amd.c	2007-09-23 23:39:11.000000000 +0000
@@ -117,6 +117,7 @@
 				break;
 			}
 			
+#ifdef CONFIG_X86_TSC /* this test requires the presence of the TSC */
 			if ( c->x86_model == 6 && c->x86_mask == 1 ) {
 				const int K6_BUG_LOOP = 1000000;
 				int n;
@@ -144,6 +145,7 @@
 					printk("probably OK (after B9730xxxx).\n");
 				printk(KERN_INFO "Please see http://membres.lycos.fr/poulot/k6bug.html\n");
 			}
+#endif
 
 			/* K6 with old style WHCR */
 			if (c->x86_model < 8 ||
diff -u -r linux-2.6.22.7-old/arch/i386/lib/delay.c linux-2.6.22.7/arch/i386/lib/delay.c
--- linux-2.6.22.7-old/arch/i386/lib/delay.c	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/arch/i386/lib/delay.c	2007-09-23 23:15:42.000000000 +0000
@@ -37,6 +37,7 @@
 		:"0" (loops));
 }
 
+#ifdef CONFIG_X86_TSC
 /* TSC based delay: */
 static void delay_tsc(unsigned long loops)
 {
@@ -48,6 +49,7 @@
 		rdtscl(now);
 	} while ((now-bclock) < loops);
 }
+#endif
 
 /*
  * Since we calibrate only once at boot, this
@@ -55,6 +57,7 @@
  */
 static void (*delay_fn)(unsigned long) = delay_loop;
 
+#ifdef CONFIG_X86_TSC
 void use_tsc_delay(void)
 {
 	delay_fn = delay_tsc;
@@ -68,6 +71,7 @@
 	}
 	return -1;
 }
+#endif
 
 void __delay(unsigned long loops)
 {
diff -u -r linux-2.6.22.7-old/include/asm-i386/cpufeature.h linux-2.6.22.7/include/asm-i386/cpufeature.h
--- linux-2.6.22.7-old/include/asm-i386/cpufeature.h	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/include/asm-i386/cpufeature.h	2007-09-23 23:32:13.000000000 +0000
@@ -119,7 +119,11 @@
 #define cpu_has_vme		boot_cpu_has(X86_FEATURE_VME)
 #define cpu_has_de		boot_cpu_has(X86_FEATURE_DE)
 #define cpu_has_pse		boot_cpu_has(X86_FEATURE_PSE)
+#ifdef CONFIG_X86_TSC
 #define cpu_has_tsc		boot_cpu_has(X86_FEATURE_TSC)
+#else
+#define cpu_has_tsc		0
+#endif
 #define cpu_has_pae		boot_cpu_has(X86_FEATURE_PAE)
 #define cpu_has_pge		boot_cpu_has(X86_FEATURE_PGE)
 #define cpu_has_apic		boot_cpu_has(X86_FEATURE_APIC)
diff -u -r linux-2.6.22.7-old/include/asm-i386/delay.h linux-2.6.22.7/include/asm-i386/delay.h
--- linux-2.6.22.7-old/include/asm-i386/delay.h	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/include/asm-i386/delay.h	2007-09-23 23:16:25.000000000 +0000
@@ -26,6 +26,10 @@
 	((n) > 20000 ? __bad_ndelay() : __const_udelay((n) * 5ul)) : \
 	__ndelay(n))
 
+#ifdef CONFIG_X86_TSC
 void use_tsc_delay(void);
+#else
+static inline void use_tsc_delay(void) { }
+#endif
 
 #endif /* defined(_I386_DELAY_H) */
diff -u -r linux-2.6.22.7-old/include/asm-i386/msr.h linux-2.6.22.7/include/asm-i386/msr.h
--- linux-2.6.22.7-old/include/asm-i386/msr.h	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/include/asm-i386/msr.h	2007-09-23 23:41:08.000000000 +0000
@@ -60,12 +60,14 @@
 	return err;
 }
 
+#ifdef CONFIG_X86_TSC
 static inline unsigned long long native_read_tsc(void)
 {
 	unsigned long long val;
 	asm volatile("rdtsc" : "=A" (val));
 	return val;
 }
+#endif
 
 static inline unsigned long long native_read_pmc(void)
 {
@@ -117,6 +119,8 @@
 		__err;							\
 	})
 
+#ifdef CONFIG_X86_TSC
+
 #define rdtscl(low)						\
 	((low) = (u32)native_read_tsc())
 
@@ -125,6 +129,16 @@
 
 #define write_tsc(val1,val2) wrmsr(0x10, val1, val2)
 
+#else /* CONFIG_X86_TSC */
+
+#define rdtscl(low) ((low) = 0)
+
+#define rdtscll(val) ((val) = 0)
+
+#define write_tsc(val1,val2)
+
+#endif /* CONFIG_X86_TSC */
+
 #define rdpmc(counter,low,high)					\
 	do {							\
 		u64 _l = native_read_pmc();			\
diff -u -r linux-2.6.22.7-old/include/asm-i386/processor.h linux-2.6.22.7/include/asm-i386/processor.h
--- linux-2.6.22.7-old/include/asm-i386/processor.h	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/include/asm-i386/processor.h	2007-09-23 22:58:59.000000000 +0000
@@ -24,7 +24,11 @@
 #include <asm/processor-flags.h>
 
 /* flag for disabling the tsc */
+#ifdef CONFIG_X86_TSC
 extern int tsc_disable;
+#else
+#  define tsc_disable 1
+#endif
 
 struct desc_struct {
 	unsigned long a,b;
diff -u -r linux-2.6.22.7-old/include/asm-i386/timer.h linux-2.6.22.7/include/asm-i386/timer.h
--- linux-2.6.22.7-old/include/asm-i386/timer.h	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/include/asm-i386/timer.h	2007-09-23 23:12:35.000000000 +0000
@@ -12,7 +12,12 @@
 extern int timer_ack;
 extern int no_timer_check;
 extern int no_sync_cmos_clock;
+
+#ifdef CONFIG_X86_TSC
 extern int recalibrate_cpu_khz(void);
+#else
+static inline int recalibrate_cpu_khz(void) { return -ENODEV; }
+#endif
 
 #ifndef CONFIG_PARAVIRT
 #define get_scheduled_cycles(val) rdtscll(val)
diff -u -r linux-2.6.22.7-old/include/asm-i386/timex.h linux-2.6.22.7/include/asm-i386/timex.h
--- linux-2.6.22.7-old/include/asm-i386/timex.h	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/include/asm-i386/timex.h	2007-09-23 23:20:42.000000000 +0000
@@ -15,8 +15,12 @@
 #  define CLOCK_TICK_RATE 1193182 /* Underlying HZ */
 #endif
 
-
+#ifdef CONFIG_X86_TSC
 extern int read_current_timer(unsigned long *timer_value);
+#else
+static inline int read_current_timer(unsigned long *timer_value) { return -1; }
+#endif
+
 #define ARCH_HAS_READ_CURRENT_TIMER	1
 
 #endif
diff -u -r linux-2.6.22.7-old/include/asm-i386/tsc.h linux-2.6.22.7/include/asm-i386/tsc.h
--- linux-2.6.22.7-old/include/asm-i386/tsc.h	2007-09-21 22:38:23.000000000 +0000
+++ linux-2.6.22.7/include/asm-i386/tsc.h	2007-09-23 23:36:29.000000000 +0000
@@ -25,7 +25,7 @@
 		return 0;
 #endif
 
-#if defined(CONFIG_X86_GENERIC) || defined(CONFIG_X86_TSC)
+#if defined(CONFIG_X86_GENERIC) && defined(CONFIG_X86_TSC)
 	rdtscll(ret);
 #endif
 	return ret;
@@ -34,6 +34,7 @@
 /* Like get_cycles, but make sure the CPU is synchronized. */
 static __always_inline cycles_t get_cycles_sync(void)
 {
+#ifdef CONFIG_X86_TSC
 	unsigned long long ret;
 	unsigned eax, edx;
 
@@ -57,8 +58,12 @@
 	rdtscll(ret);
 
 	return ret;
+#else
+	return 0;
+#endif
 }
 
+#ifdef CONFIG_X86_TSC
 extern void tsc_init(void);
 extern void mark_tsc_unstable(char *reason);
 extern int unsynchronized_tsc(void);
@@ -70,5 +75,15 @@
  */
 extern void check_tsc_sync_source(int cpu);
 extern void check_tsc_sync_target(void);
+#else /* CONFIG_X86_TSC */
+/* effectively disable all calls to TSC functions.
+ * GCC should optimize these inline functions down to nothing. */
+static inline void tsc_init(void) { }
+static inline void mark_tsc_unstable(char *reason) { }
+static inline int unsynchronized_tsc(void) { return 1; }
+static inline void init_tsc_clocksource(void) { }
+static inline void check_tsc_sync_source(int cpu) { }
+static inline void check_tsc_sync_target(void) { }
+#endif /* CONFIG_X86_TSC */
 
 #endif


             reply	other threads:[~2007-09-24  9:21 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-09-24  8:51 Jonathan Campbell [this message]
2007-09-24 17:49 ` [PATCH] Patches for tiny 386 kernels, again. Linux kernel 2.6.22.7 Randy Dunlap
2007-09-26 18:42   ` Jonathan Campbell
2007-09-26 22:06     ` Randy Dunlap
2007-09-26 23:20     ` Randy Dunlap
2007-09-26 23:44       ` Jonathan Campbell
     [not found]       ` <46FAEE97.7090902@nerdgrounds.com>
2007-09-26 23:47         ` Randy Dunlap
2007-09-26 23:49           ` Jonathan Campbell
2007-09-28 21:24   ` Bill Davidsen
2007-09-28 21:56     ` Randy Dunlap
2007-10-01 13:44     ` Lennart Sorensen
2007-10-01 14:28       ` Bill Davidsen
2007-10-02  4:48         ` Willy Tarreau
2007-09-24 19:09 ` Dave Jones
2007-09-25  4:45   ` Andrey Panin
2007-09-25  7:28   ` Jan Engelhardt

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=46F77A85.6020202@nerdgrounds.com \
    --to=jon@nerdgrounds.com \
    --cc=linux-kernel@vger.kernel.org \
    /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.