Merge branches 'tiny/bloat-o-meter-no-SyS', 'tiny/more-procless', 'tiny/no-advice...
authorJosh Triplett <josh@joshtriplett.org>
Tue, 23 Sep 2014 06:14:40 +0000 (23:14 -0700)
committerJosh Triplett <josh@joshtriplett.org>
Tue, 23 Sep 2014 06:14:40 +0000 (23:14 -0700)
14 files changed:
arch/x86/Kconfig
arch/x86/Makefile
arch/x86/boot/Makefile
arch/x86/boot/compressed/Makefile
arch/x86/boot/compressed/aslr.c
arch/x86/boot/compressed/early_serial_console.c
arch/x86/boot/cpu.c
arch/x86/configs/tiny.config [new file with mode: 0644]
arch/x86/include/asm/cpufeature.h
arch/x86/kernel/cpu/Makefile
arch/x86/kernel/cpu/common.c
kernel/configs/tiny.config [new file with mode: 0644]
scripts/bloat-o-meter
scripts/kconfig/Makefile

index 5d0bf1aa9dcb6d68fd39f395dcbef9f89954cbc0..a11f27c4266a6758387b9bd9643cd8819ee22c2c 100644 (file)
@@ -136,6 +136,7 @@ config X86
        select HAVE_ACPI_APEI if ACPI
        select HAVE_ACPI_APEI_NMI if ACPI
        select ACPI_LEGACY_TABLES_LOOKUP if ACPI
+       select X86_FEATURE_NAMES if PROC_FS
 
 config INSTRUCTION_DECODER
        def_bool y
@@ -313,6 +314,17 @@ config SMP
 
          If you don't know what to do here, say N.
 
+config X86_FEATURE_NAMES
+       bool "Processor feature human-readable names" if EMBEDDED
+       default y
+       ---help---
+         This option compiles in a table of x86 feature bits and corresponding
+         names.  This is required to support /proc/cpuinfo and a few kernel
+         messages.  You can disable this to save space, at the expense of
+         making those few kernel messages show numeric feature bits instead.
+
+         If in doubt, say Y.
+
 config X86_X2APIC
        bool "Support x2apic"
        depends on X86_LOCAL_APIC && X86_64 && IRQ_REMAP
index c1aa368878431fe0b551cb4704b6587fd8826145..7705b6f921ac78b2794626a022e4d642ec19b81d 100644 (file)
@@ -255,12 +255,6 @@ archclean:
        $(Q)$(MAKE) $(clean)=$(boot)
        $(Q)$(MAKE) $(clean)=arch/x86/tools
 
-PHONY += kvmconfig
-kvmconfig:
-       $(if $(wildcard $(objtree)/.config),, $(error You need an existing .config for this target))
-       $(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m -O $(objtree) $(objtree)/.config $(srctree)/arch/x86/configs/kvm_guest.config
-       $(Q)yes "" | $(MAKE) -f $(srctree)/Makefile oldconfig
-
 define archhelp
   echo  '* bzImage      - Compressed kernel image (arch/x86/boot/bzImage)'
   echo  '  install      - Install kernel using'
@@ -274,5 +268,4 @@ define archhelp
   echo  '                  bzdisk/fdimage*/isoimage also accept:'
   echo  '                  FDARGS="..."  arguments for the booted kernel'
   echo  '                  FDINITRD=file initrd for the booted kernel'
-  echo  '  kvmconfig   - Enable additional options for guest kernel support'
 endef
index dbe8dd2fe247fb0632a79d5a20d1b4714729c47d..5b016e2498f3d3250b4edf12584a524bcb79e968 100644 (file)
@@ -35,19 +35,22 @@ setup-y             += video-vesa.o
 setup-y                += video-bios.o
 
 targets                += $(setup-y)
-hostprogs-y    := mkcpustr tools/build
+hostprogs-y    := tools/build
+hostprogs-$(CONFIG_X86_FEATURE_NAMES) += mkcpustr
 
 HOST_EXTRACFLAGS += -I$(srctree)/tools/include \
                    -include include/generated/autoconf.h \
                    -D__EXPORTED_HEADERS__
 
+ifdef CONFIG_X86_FEATURE_NAMES
 $(obj)/cpu.o: $(obj)/cpustr.h
 
 quiet_cmd_cpustr = CPUSTR  $@
       cmd_cpustr = $(obj)/mkcpustr > $@
-targets                += cpustr.h
+targets += cpustr.h
 $(obj)/cpustr.h: $(obj)/mkcpustr FORCE
        $(call if_changed,cpustr)
+endif
 
 # ---------------------------------------------------------------------------
 
index 7a801a310e3740fd943ba3456aec57548a1301dc..20db5b3609de54f594b2039abf82d17d27ab1737 100644 (file)
@@ -26,18 +26,19 @@ LDFLAGS_vmlinux := -T
 hostprogs-y    := mkpiggy
 HOST_EXTRACFLAGS += -I$(srctree)/tools/include
 
-VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \
-       $(obj)/string.o $(obj)/cmdline.o $(obj)/early_serial_console.o \
-       $(obj)/piggy.o $(obj)/cpuflags.o $(obj)/aslr.o
+vmlinux-objs-y := $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \
+       $(obj)/string.o $(obj)/cmdline.o \
+       $(obj)/piggy.o $(obj)/cpuflags.o
+
+vmlinux-objs-$(CONFIG_EARLY_PRINTK) += $(obj)/early_serial_console.o
+vmlinux-objs-$(CONFIG_RANDOMIZE_BASE) += $(obj)/aslr.o
 
 $(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone
 
-ifeq ($(CONFIG_EFI_STUB), y)
-       VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o \
-                               $(objtree)/drivers/firmware/efi/libstub/lib.a
-endif
+vmlinux-objs-$(CONFIG_EFI_STUB) += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o \
+       $(objtree)/drivers/firmware/efi/libstub/lib.a
 
-$(obj)/vmlinux: $(VMLINUX_OBJS) FORCE
+$(obj)/vmlinux: $(vmlinux-objs-y) FORCE
        $(call if_changed,ld)
        @:
 
@@ -45,7 +46,7 @@ OBJCOPYFLAGS_vmlinux.bin :=  -R .comment -S
 $(obj)/vmlinux.bin: vmlinux FORCE
        $(call if_changed,objcopy)
 
-targets += $(patsubst $(obj)/%,%,$(VMLINUX_OBJS)) vmlinux.bin.all vmlinux.relocs
+targets += $(patsubst $(obj)/%,%,$(vmlinux-objs-y)) vmlinux.bin.all vmlinux.relocs
 
 CMD_RELOCS = arch/x86/tools/relocs
 quiet_cmd_relocs = RELOCS  $@
index fc6091abedb7ff363da950a0766f45f9834cf1df..913c999b004527203409e50f385cac2f266a850d 100644 (file)
@@ -1,6 +1,5 @@
 #include "misc.h"
 
-#ifdef CONFIG_RANDOMIZE_BASE
 #include <asm/msr.h>
 #include <asm/archrandom.h>
 #include <asm/e820.h>
@@ -320,5 +319,3 @@ unsigned char *choose_kernel_location(unsigned char *input,
 out:
        return (unsigned char *)choice;
 }
-
-#endif /* CONFIG_RANDOMIZE_BASE */
index d3d003cb5481cdcabe0b5c5369bad920838b8d8f..261e81fb95826d0264c8ad3148f6259cc0c3f51d 100644 (file)
@@ -1,9 +1,5 @@
 #include "misc.h"
 
-#ifdef CONFIG_EARLY_PRINTK
-
 int early_serial_base;
 
 #include "../early_serial_console.c"
-
-#endif
index 6ec6bb6e9957a0319259f966c0ac7b2ca4ff69a0..29207f69ae8c760837984307b51afcf5377c1b49 100644 (file)
@@ -16,7 +16,9 @@
  */
 
 #include "boot.h"
+#ifdef CONFIG_X86_FEATURE_NAMES
 #include "cpustr.h"
+#endif
 
 static char *cpu_name(int level)
 {
@@ -32,11 +34,48 @@ static char *cpu_name(int level)
        }
 }
 
+static void show_cap_strs(u32 *err_flags)
+{
+       int i, j;
+#ifdef CONFIG_X86_FEATURE_NAMES
+       const unsigned char *msg_strs = (const unsigned char *)x86_cap_strs;
+       for (i = 0; i < NCAPINTS; i++) {
+               u32 e = err_flags[i];
+               for (j = 0; j < 32; j++) {
+                       if (msg_strs[0] < i ||
+                           (msg_strs[0] == i && msg_strs[1] < j)) {
+                               /* Skip to the next string */
+                               msg_strs += 2;
+                               while (*msg_strs++)
+                                       ;
+                       }
+                       if (e & 1) {
+                               if (msg_strs[0] == i &&
+                                   msg_strs[1] == j &&
+                                   msg_strs[2])
+                                       printf("%s ", msg_strs+2);
+                               else
+                                       printf("%d:%d ", i, j);
+                       }
+                       e >>= 1;
+               }
+       }
+#else
+       for (i = 0; i < NCAPINTS; i++) {
+               u32 e = err_flags[i];
+               for (j = 0; j < 32; j++) {
+                       if (e & 1)
+                               printf("%d:%d ", i, j);
+                       e >>= 1;
+               }
+       }
+#endif
+}
+
 int validate_cpu(void)
 {
        u32 *err_flags;
        int cpu_level, req_level;
-       const unsigned char *msg_strs;
 
        check_cpu(&cpu_level, &req_level, &err_flags);
 
@@ -49,34 +88,9 @@ int validate_cpu(void)
        }
 
        if (err_flags) {
-               int i, j;
                puts("This kernel requires the following features "
                     "not present on the CPU:\n");
-
-               msg_strs = (const unsigned char *)x86_cap_strs;
-
-               for (i = 0; i < NCAPINTS; i++) {
-                       u32 e = err_flags[i];
-
-                       for (j = 0; j < 32; j++) {
-                               if (msg_strs[0] < i ||
-                                   (msg_strs[0] == i && msg_strs[1] < j)) {
-                                       /* Skip to the next string */
-                                       msg_strs += 2;
-                                       while (*msg_strs++)
-                                               ;
-                               }
-                               if (e & 1) {
-                                       if (msg_strs[0] == i &&
-                                           msg_strs[1] == j &&
-                                           msg_strs[2])
-                                               printf("%s ", msg_strs+2);
-                                       else
-                                               printf("%d:%d ", i, j);
-                               }
-                               e >>= 1;
-                       }
-               }
+               show_cap_strs(err_flags);
                putchar('\n');
                return -1;
        } else {
diff --git a/arch/x86/configs/tiny.config b/arch/x86/configs/tiny.config
new file mode 100644 (file)
index 0000000..4e2ecfa
--- /dev/null
@@ -0,0 +1 @@
+CONFIG_NOHIGHMEM=y
index bb9b258d60e76e9c3dfc3cefe8c7f74ac80e3caf..516903b98e06f5d9c20be87e07231a682714d287 100644 (file)
 #include <asm/asm.h>
 #include <linux/bitops.h>
 
+#ifdef CONFIG_X86_FEATURE_NAMES
 extern const char * const x86_cap_flags[NCAPINTS*32];
 extern const char * const x86_power_flags[32];
+#define X86_CAP_FMT "%s"
+#define x86_cap_flag(flag) x86_cap_flags[flag]
+#else
+#define X86_CAP_FMT "%d:%d"
+#define x86_cap_flag(flag) ((flag) >> 5), ((flag) & 31)
+#endif
 
 /*
  * In order to save room, we index into this array by doing
index 7fd54f09b011e21fa6b24282c5110be928c730be..77dcab277710763cc0e6cc7ceb9a3fb8ef0b8c57 100644 (file)
@@ -13,10 +13,13 @@ nostackp := $(call cc-option, -fno-stack-protector)
 CFLAGS_common.o                := $(nostackp)
 
 obj-y                  := intel_cacheinfo.o scattered.o topology.o
-obj-y                  += proc.o capflags.o powerflags.o common.o
+obj-y                  += common.o
 obj-y                  += rdrand.o
 obj-y                  += match.o
 
+obj-$(CONFIG_PROC_FS)  += proc.o
+obj-$(CONFIG_X86_FEATURE_NAMES) += capflags.o powerflags.o
+
 obj-$(CONFIG_X86_32)   += bugs.o
 obj-$(CONFIG_X86_64)   += bugs_64.o
 
@@ -48,6 +51,7 @@ obj-$(CONFIG_X86_LOCAL_APIC)          += perfctr-watchdog.o perf_event_amd_ibs.o
 
 obj-$(CONFIG_HYPERVISOR_GUEST)         += vmware.o hypervisor.o mshyperv.o
 
+ifdef CONFIG_X86_FEATURE_NAMES
 quiet_cmd_mkcapflags = MKCAP   $@
       cmd_mkcapflags = $(CONFIG_SHELL) $(srctree)/$(src)/mkcapflags.sh $< $@
 
@@ -56,3 +60,4 @@ cpufeature = $(src)/../../include/asm/cpufeature.h
 targets += capflags.c
 $(obj)/capflags.c: $(cpufeature) $(src)/mkcapflags.sh FORCE
        $(call if_changed,mkcapflags)
+endif
index e4ab2b42bd6f469528c73cac4ac0fb186b5bdbd3..c649f236e288849f94f8b2bf4501117cd2f1a698 100644 (file)
@@ -346,8 +346,8 @@ static void filter_cpuid_features(struct cpuinfo_x86 *c, bool warn)
                        continue;
 
                printk(KERN_WARNING
-                      "CPU: CPU feature %s disabled, no CPUID level 0x%x\n",
-                               x86_cap_flags[df->feature], df->level);
+                      "CPU: CPU feature " X86_CAP_FMT " disabled, no CPUID level 0x%x\n",
+                               x86_cap_flag(df->feature), df->level);
        }
 }
 
diff --git a/kernel/configs/tiny.config b/kernel/configs/tiny.config
new file mode 100644 (file)
index 0000000..c2de56a
--- /dev/null
@@ -0,0 +1,4 @@
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_KERNEL_XZ=y
+CONFIG_OPTIMIZE_INLINING=y
+CONFIG_SLOB=y
index 549d0ab8c66204ec8db65de3d48ce619f7dee925..23e78dcd12bf721a88316a007ede27d3454c906a 100755 (executable)
@@ -20,6 +20,8 @@ def getsizes(file):
         if type in "tTdDbBrR":
             # strip generated symbols
             if name.startswith("__mod_"): continue
+            if name.startswith("SyS_"): continue
+            if name.startswith("compat_SyS_"): continue
             if name == "linux_banner": continue
             # statics and some other optimizations adds random .NUMBER
             name = re.sub(r'\.[0-9]+', '', name)
index 9c4d2412fb724e8b8d93cd02b70488ba3f779cb9..ebf40f6edb4d4ee5f847a103cb082bcddec99dd6 100644 (file)
@@ -104,6 +104,23 @@ endif
 %_defconfig: $(obj)/conf
        $(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
 
+configfiles=$(wildcard $(srctree)/kernel/configs/$(1).config $(srctree)/arch/$(SRCARCH)/configs/$(1).config)
+
+define mergeconfig
+$(if $(wildcard $(objtree)/.config),, $(error You need an existing .config for this target))
+$(if $(call configfiles,$(1)),, $(error No configuration exists for this target on this architecture))
+$(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m -O $(objtree) $(objtree)/.config $(call configfiles,$(1))
+$(Q)yes "" | $(MAKE) -f $(srctree)/Makefile oldconfig
+endef
+
+PHONY += kvmconfig
+kvmconfig:
+       $(call mergeconfig,kvm_guest)
+
+PHONY += tinyconfig
+tinyconfig: allnoconfig
+       $(call mergeconfig,tiny)
+
 # Help text used by make help
 help:
        @echo  '  config          - Update current config utilising a line-oriented program'
@@ -124,6 +141,8 @@ help:
        @echo  '  randconfig      - New config with random answer to all options'
        @echo  '  listnewconfig   - List new options'
        @echo  '  olddefconfig    - Same as silentoldconfig but sets new symbols to their default value'
+       @echo  '  kvmconfig       - Enable additional options for guest kernel support'
+       @echo  '  tinyconfig      - Configure the tiniest possible kernel'
 
 # lxdialog stuff
 check-lxdialog  := $(srctree)/$(src)/lxdialog/check-lxdialog.sh