All of lore.kernel.org
 help / color / mirror / Atom feed
From: Josh Poimboeuf <jpoimboe@redhat.com>
To: Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>
Cc: Michal Marek <mmarek@suse.cz>,
	Peter Zijlstra <peterz@infradead.org>,
	x86@kernel.org, live-patching@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH v4 1/3] x86, stackvalidate: Compile-time stack frame pointer validation
Date: Mon, 18 May 2015 11:34:10 -0500	[thread overview]
Message-ID: <ddfb7036fec3005609e7f791528644d2c98b156b.1431966710.git.jpoimboe@redhat.com> (raw)
In-Reply-To: <cover.1431966710.git.jpoimboe@redhat.com>

Frame pointer based stack traces aren't always reliable.  One big reason
is that most asm functions don't set up the frame pointer.

Fix that by enforcing that all asm functions honor CONFIG_FRAME_POINTER.
This is done with a new stackvalidate host tool which is automatically
run for every compiled .S file and which validates that every asm
function does the proper frame pointer setup.

Also, to make sure somebody didn't forget to annotate their callable asm code
as a function, flag an error for any return instructions which are hiding
outside of a function.  In almost all cases, return instructions are part of
callable functions and should be annotated as such so that we can validate
their frame pointer usage.  A whitelist mechanism exists for those few return
instructions which are not actually in callable code.

It currently only supports x86_64.  It *almost* supports x86_32, but the
stackvalidate code doesn't yet know how to deal with 32-bit REL
relocations for the return whitelists.  I tried to make the code generic
so that support for other architectures can be plugged in pretty easily.

As a first step, CONFIG_STACK_VALIDATION is disabled by default, and all
reported non-compliances result in warnings.  Right now I'm seeing 200+
warnings.  Once we get them all cleaned up, we can change the default to
CONFIG_STACK_VALIDATION=y and change the warnings to build errors so the
asm code can stay clean.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Acked-by: Michal Marek <mmarek@suse.cz>
---
 MAINTAINERS                           |   6 +
 arch/Kconfig                          |   3 +
 arch/x86/Kconfig                      |   1 +
 arch/x86/Makefile                     |   6 +-
 lib/Kconfig.debug                     |  11 ++
 scripts/Makefile                      |   1 +
 scripts/Makefile.build                |  22 ++-
 scripts/stackvalidate/Makefile        |  17 ++
 scripts/stackvalidate/arch-x86.c      | 134 +++++++++++++
 scripts/stackvalidate/arch.h          |  10 +
 scripts/stackvalidate/elf.c           | 352 ++++++++++++++++++++++++++++++++++
 scripts/stackvalidate/elf.h           |  56 ++++++
 scripts/stackvalidate/list.h          | 217 +++++++++++++++++++++
 scripts/stackvalidate/stackvalidate.c | 226 ++++++++++++++++++++++
 14 files changed, 1059 insertions(+), 3 deletions(-)
 create mode 100644 scripts/stackvalidate/Makefile
 create mode 100644 scripts/stackvalidate/arch-x86.c
 create mode 100644 scripts/stackvalidate/arch.h
 create mode 100644 scripts/stackvalidate/elf.c
 create mode 100644 scripts/stackvalidate/elf.h
 create mode 100644 scripts/stackvalidate/list.h
 create mode 100644 scripts/stackvalidate/stackvalidate.c

diff --git a/MAINTAINERS b/MAINTAINERS
index 78ea7b6..6d700bf 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9451,6 +9451,12 @@ L:	stable@vger.kernel.org
 S:	Supported
 F:	Documentation/stable_kernel_rules.txt
 
+STACK VALIDATION
+M:	Josh Poimboeuf <jpoimboe@redhat.com>
+S:	Supported
+F:	scripts/stackvalidate/
+F:	arch/x86/include/asm/func.h
+
 STAGING SUBSYSTEM
 M:	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
diff --git a/arch/Kconfig b/arch/Kconfig
index bec6666..a5c3f50 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -506,6 +506,9 @@ config HAVE_COPY_THREAD_TLS
 	  normal C parameter passing, rather than extracting the syscall
 	  argument from pt_regs.
 
+config HAVE_STACK_VALIDATION
+	bool
+
 #
 # ABI hall of shame
 #
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index c92fdcc..d60a2378a 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -146,6 +146,7 @@ config X86
 	select ACPI_LEGACY_TABLES_LOOKUP if ACPI
 	select X86_FEATURE_NAMES if PROC_FS
 	select SRCU
+	select HAVE_STACK_VALIDATION if FRAME_POINTER && X86_64
 
 config INSTRUCTION_DECODER
 	def_bool y
diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index 57996ee..c5598a0 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -180,9 +180,13 @@ KBUILD_CFLAGS += $(call cc-option,-mno-avx,)
 KBUILD_CFLAGS += $(mflags-y)
 KBUILD_AFLAGS += $(mflags-y)
 
-archscripts: scripts_basic
+archscripts: scripts_basic $(objtree)/arch/x86/lib/inat-tables.c
 	$(Q)$(MAKE) $(build)=arch/x86/tools relocs
 
+# this file is needed early by scripts/stackvalidate
+$(objtree)/arch/x86/lib/inat-tables.c:
+	$(Q)$(MAKE) $(build)=arch/x86/lib $@
+
 ###
 # Syscall table generation
 
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index eb3997b..7bfaf80 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -332,6 +332,17 @@ config FRAME_POINTER
 	  larger and slower, but it gives very useful debugging information
 	  in case of kernel bugs. (precise oopses/stacktraces/warnings)
 
+
+config STACK_VALIDATION
+	bool "Enable kernel stack validation"
+	depends on HAVE_STACK_VALIDATION
+	default n
+	help
+	  Add compile-time validations which help make kernel stack traces more
+	  reliable.  This includes checks to ensure that assembly functions
+	  save, update and restore the frame pointer or the back chain pointer.
+
+
 config DEBUG_FORCE_WEAK_PER_CPU
 	bool "Force weak per-cpu definitions"
 	depends on DEBUG_KERNEL
diff --git a/scripts/Makefile b/scripts/Makefile
index 2016a64..c882a91 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -37,6 +37,7 @@ subdir-y                     += mod
 subdir-$(CONFIG_SECURITY_SELINUX) += selinux
 subdir-$(CONFIG_DTC)         += dtc
 subdir-$(CONFIG_GDB_SCRIPTS) += gdb
+subdir-$(CONFIG_STACK_VALIDATION) += stackvalidate
 
 # Let clean descend into subdirs
 subdir-	+= basic kconfig package
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 01df30a..3b05833 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -253,6 +253,24 @@ define rule_cc_o_c
 	mv -f $(dot-target).tmp $(dot-target).cmd
 endef
 
+ifdef CONFIG_STACK_VALIDATION
+stackvalidate = $(objtree)/scripts/stackvalidate/stackvalidate
+cmd_stackvalidate =							  \
+	case $(@) in							  \
+		arch/x86/purgatory/*) ;;				  \
+		*) $(stackvalidate) "$(@)"; \
+	esac;
+endif
+
+define rule_as_o_S
+	$(call echo-cmd,as_o_S) $(cmd_as_o_S);				  \
+	$(cmd_stackvalidate)						  \
+	scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,as_o_S)' >    \
+	                                              $(dot-target).tmp;  \
+	rm -f $(depfile);						  \
+	mv -f $(dot-target).tmp $(dot-target).cmd
+endef
+
 # Built-in and composite module parts
 $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
 	$(call cmd,force_checksrc)
@@ -290,8 +308,8 @@ $(obj)/%.s: $(src)/%.S FORCE
 quiet_cmd_as_o_S = AS $(quiet_modtag)  $@
 cmd_as_o_S       = $(CC) $(a_flags) -c -o $@ $<
 
-$(obj)/%.o: $(src)/%.S FORCE
-	$(call if_changed_dep,as_o_S)
+$(obj)/%.o: $(src)/%.S $(stackvalidate) FORCE
+	$(call if_changed_rule,as_o_S)
 
 targets += $(real-objs-y) $(real-objs-m) $(lib-y)
 targets += $(extra-y) $(MAKECMDGOALS) $(always)
diff --git a/scripts/stackvalidate/Makefile b/scripts/stackvalidate/Makefile
new file mode 100644
index 0000000..6027ec4
--- /dev/null
+++ b/scripts/stackvalidate/Makefile
@@ -0,0 +1,17 @@
+hostprogs-y := stackvalidate
+always := $(hostprogs-y)
+
+stackvalidate-objs := stackvalidate.o elf.o
+
+HOSTCFLAGS += -Werror
+HOSTLOADLIBES_stackvalidate := -lelf
+
+ifdef CONFIG_X86
+
+stackvalidate-objs += arch-x86.o
+
+HOSTCFLAGS_arch-x86.o := -I$(objtree)/arch/x86/lib/ -I$(srctree)/arch/x86/include/ -I$(srctree)/arch/x86/lib/
+
+$(obj)/arch-x86.o: $(srctree)/arch/x86/lib/insn.c $(srctree)/arch/x86/lib/inat.c $(srctree)/arch/x86/include/asm/inat_types.h $(srctree)/arch/x86/include/asm/inat.h $(srctree)/arch/x86/include/asm/insn.h $(objtree)/arch/x86/lib/inat-tables.c
+
+endif
diff --git a/scripts/stackvalidate/arch-x86.c b/scripts/stackvalidate/arch-x86.c
new file mode 100644
index 0000000..fbc0756
--- /dev/null
+++ b/scripts/stackvalidate/arch-x86.c
@@ -0,0 +1,134 @@
+#include <stdio.h>
+
+#define unlikely(cond) (cond)
+#include <asm/insn.h>
+#include <inat.c>
+#include <insn.c>
+
+#include "elf.h"
+#include "arch.h"
+
+static int is_x86_64(struct elf *elf)
+{
+	switch (elf->ehdr.e_machine) {
+	case EM_X86_64:
+		return 1;
+	case EM_386:
+		return 0;
+	default:
+		WARN("unexpected ELF machine type %d", elf->ehdr.e_machine);
+		return -1;
+	}
+}
+
+/*
+ * arch_validate_function() - Ensures the given asm function saves, sets up,
+ * and restores the frame pointer.
+ *
+ * The frame pointer prologue/epilogue should look something like:
+ *
+ *   push %rbp
+ *   mov %rsp, %rbp
+ *   [ function body ]
+ *   pop %rbp
+ *   ret
+ *
+ * Return value:
+ *   -1: bad instruction
+ *    1: missing frame pointer logic
+ *    0: validation succeeded
+ */
+int arch_validate_function(struct elf *elf, struct symbol *func)
+{
+	struct insn insn;
+	unsigned long addr, length;
+	int push, mov, pop, ret, x86_64;
+
+	push = mov = pop = ret = 0;
+
+	x86_64 = is_x86_64(elf);
+	if (x86_64 == -1)
+		return -1;
+
+	for (addr = func->start; addr < func->end; addr += length) {
+		insn_init(&insn, (void *)addr, func->end - addr, x86_64);
+		insn_get_length(&insn);
+		length = insn.length;
+		insn_get_opcode(&insn);
+		if (!length || !insn.opcode.got) {
+			WARN("%s+0x%lx: bad instruction", func->name,
+			     addr - func->start);
+			return -1;
+		}
+
+		switch (insn.opcode.bytes[0]) {
+		case 0x55:
+			if (!insn.rex_prefix.nbytes)
+				/* push bp */
+				push++;
+			break;
+		case 0x5d:
+			if (!insn.rex_prefix.nbytes)
+				/* pop bp */
+				pop++;
+			break;
+		case 0xc9: /* leave */
+			pop++;
+			break;
+		case 0x89:
+			insn_get_modrm(&insn);
+			if (insn.modrm.bytes[0] == 0xe5)
+				/* mov sp, bp */
+				mov++;
+			break;
+		case 0xc3: /* ret */
+			ret++;
+			break;
+		}
+	}
+
+	if (push != 1 || mov != 1 || !pop || !ret || pop != ret) {
+		WARN("%s() is missing frame pointer logic.  Please use FUNC_ENTER.",
+		     func->name);
+		return 1;
+	}
+
+	return 0;
+}
+
+/*
+ * arch_is_return_insn() - Determines whether the instruction at the given
+ * address is a return instruction.  Also returns the instruction length in
+ * *len.
+ *
+ * Return value:
+ *   -1: bad instruction
+ *    0: no, it's not a return instruction
+ *    1: yes, it's a return instruction
+ */
+int arch_is_return_insn(struct elf *elf, unsigned long addr,
+			unsigned int maxlen, unsigned int *len)
+{
+	struct insn insn;
+	int x86_64;
+
+	x86_64 = is_x86_64(elf);
+	if (x86_64 == -1)
+		return -1;
+
+	insn_init(&insn, (void *)addr, maxlen, x86_64);
+	insn_get_length(&insn);
+	insn_get_opcode(&insn);
+	if (!insn.opcode.got)
+		return -1;
+
+	*len = insn.length;
+
+	switch (insn.opcode.bytes[0]) {
+	case 0xc2: case 0xc3: /* ret near */
+	case 0xca: case 0xcb: /* ret far */
+		return 1;
+	}
+
+	return 0;
+}
diff --git a/scripts/stackvalidate/arch.h b/scripts/stackvalidate/arch.h
new file mode 100644
index 0000000..3b91b1c
--- /dev/null
+++ b/scripts/stackvalidate/arch.h
@@ -0,0 +1,10 @@
+#ifndef _ARCH_H_
+#define _ARCH_H_
+
+#include "elf.h"
+
+int arch_validate_function(struct elf *elf, struct symbol *func);
+int arch_is_return_insn(struct elf *elf, unsigned long addr,
+			unsigned int maxlen, unsigned int *len);
+
+#endif /* _ARCH_H_ */
diff --git a/scripts/stackvalidate/elf.c b/scripts/stackvalidate/elf.c
new file mode 100644
index 0000000..a1419a5
--- /dev/null
+++ b/scripts/stackvalidate/elf.c
@@ -0,0 +1,352 @@
+/*
+ * elf.c - ELF access library
+ *
+ * Adapted from kpatch (https://github.com/dynup/kpatch):
+ * Copyright (C) 2013-2015 Josh Poimboeuf <jpoimboe@redhat.com>
+ * Copyright (C) 2014 Seth Jennings <sjenning@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "elf.h"
+
+struct section *elf_find_section_by_name(struct elf *elf, const char *name)
+{
+	struct section *sec;
+
+	list_for_each_entry(sec, &elf->sections, list)
+		if (!strcmp(sec->name, name))
+			return sec;
+
+	return NULL;
+}
+
+static struct section *elf_find_section_by_index(struct elf *elf,
+						 unsigned int index)
+{
+	struct section *sec;
+
+	list_for_each_entry(sec, &elf->sections, list)
+		if (sec->index == index)
+			return sec;
+
+	return NULL;
+}
+
+static struct symbol *elf_find_symbol_by_index(struct elf *elf,
+					       unsigned int index)
+{
+	struct section *sec;
+	struct symbol *sym;
+
+	list_for_each_entry(sec, &elf->sections, list)
+		list_for_each_entry(sym, &sec->symbols, list)
+			if (sym->index == index)
+				return sym;
+
+	return NULL;
+}
+
+static int elf_read_sections(struct elf *elf)
+{
+	Elf_Scn *s = NULL;
+	struct section *sec;
+	size_t shstrndx, sections_nr;
+	int i;
+
+	if (elf_getshdrnum(elf->elf, &sections_nr)) {
+		perror("elf_getshdrnum");
+		return -1;
+	}
+
+	if (elf_getshdrstrndx(elf->elf, &shstrndx)) {
+		perror("elf_getshdrstrndx");
+		return -1;
+	}
+
+	for (i = 0; i < sections_nr; i++) {
+		sec = malloc(sizeof(*sec));
+		if (!sec) {
+			perror("malloc");
+			return -1;
+		}
+		memset(sec, 0, sizeof(*sec));
+
+		INIT_LIST_HEAD(&sec->symbols);
+		INIT_LIST_HEAD(&sec->relas);
+
+		list_add_tail(&sec->list, &elf->sections);
+
+		s = elf_getscn(elf->elf, i);
+		if (!s) {
+			perror("elf_getscn");
+			return -1;
+		}
+
+		sec->index = elf_ndxscn(s);
+
+		if (!gelf_getshdr(s, &sec->sh)) {
+			perror("gelf_getshdr");
+			return -1;
+		}
+
+		sec->name = elf_strptr(elf->elf, shstrndx, sec->sh.sh_name);
+		if (!sec->name) {
+			perror("elf_strptr");
+			return -1;
+		}
+
+		sec->data = elf_getdata(s, NULL);
+		if (!sec->data) {
+			perror("elf_getdata");
+			return -1;
+		}
+
+		if (sec->data->d_off != 0 ||
+		    sec->data->d_size != sec->sh.sh_size) {
+			WARN("unexpected data attributes for %s", sec->name);
+			return -1;
+		}
+
+		sec->start = (unsigned long)sec->data->d_buf;
+		sec->end = sec->start + sec->data->d_size;
+	}
+
+	/* sanity check, one more call to elf_nextscn() should return NULL */
+	if (elf_nextscn(elf->elf, s)) {
+		WARN("section entry mismatch");
+		return -1;
+	}
+
+	return 0;
+}
+
+static int elf_read_symbols(struct elf *elf)
+{
+	struct section *symtab;
+	struct symbol *sym;
+	struct list_head *entry, *tmp;
+	int symbols_nr, i;
+
+	symtab = elf_find_section_by_name(elf, ".symtab");
+	if (!symtab) {
+		WARN("missing symbol table");
+		return -1;
+	}
+
+	symbols_nr = symtab->sh.sh_size / symtab->sh.sh_entsize;
+
+	for (i = 0; i < symbols_nr; i++) {
+		sym = malloc(sizeof(*sym));
+		if (!sym) {
+			perror("malloc");
+			return -1;
+		}
+		memset(sym, 0, sizeof(*sym));
+
+		sym->index = i;
+
+		if (!gelf_getsym(symtab->data, i, &sym->sym)) {
+			perror("gelf_getsym");
+			goto err;
+		}
+
+		sym->name = elf_strptr(elf->elf, symtab->sh.sh_link,
+				       sym->sym.st_name);
+		if (!sym->name) {
+			perror("elf_strptr");
+			goto err;
+		}
+
+		sym->type = GELF_ST_TYPE(sym->sym.st_info);
+		sym->bind = GELF_ST_BIND(sym->sym.st_info);
+
+		if (sym->sym.st_shndx > SHN_UNDEF &&
+		    sym->sym.st_shndx < SHN_LORESERVE) {
+			sym->sec = elf_find_section_by_index(elf,
+							     sym->sym.st_shndx);
+			if (!sym->sec) {
+				WARN("couldn't find section for symbol %s",
+				     sym->name);
+				goto err;
+			}
+			if (sym->type == STT_SECTION)
+				sym->name = sym->sec->name;
+		} else
+			sym->sec = elf_find_section_by_index(elf, 0);
+
+		sym->start = sym->sec->start + sym->sym.st_value;
+		sym->end = sym->start + sym->sym.st_size;
+
+		/* sorted insert into a per-section list */
+		entry = &sym->sec->symbols;
+		list_for_each_prev(tmp, &sym->sec->symbols) {
+			struct symbol *s;
+
+			s = list_entry(tmp, struct symbol, list);
+
+			if (sym->start > s->start) {
+				entry = tmp;
+				break;
+			}
+
+			if (sym->start == s->start && sym->end >= s->end) {
+				entry = tmp;
+				break;
+			}
+		}
+		list_add(&sym->list, entry);
+	}
+
+	return 0;
+
+err:
+	free(sym);
+	return -1;
+}
+
+static int elf_read_relas(struct elf *elf)
+{
+	struct section *sec;
+	struct rela *rela;
+	int i;
+	unsigned int symndx;
+
+	list_for_each_entry(sec, &elf->sections, list) {
+		if (sec->sh.sh_type != SHT_RELA)
+			continue;
+
+		sec->base = elf_find_section_by_name(elf, sec->name + 5);
+		if (!sec->base) {
+			WARN("can't find base section for rela section %s",
+			     sec->name);
+			return -1;
+		}
+
+		sec->base->rela = sec;
+
+		for (i = 0; i < sec->sh.sh_size / sec->sh.sh_entsize; i++) {
+			rela = malloc(sizeof(*rela));
+			if (!rela) {
+				perror("malloc");
+				return -1;
+			}
+			memset(rela, 0, sizeof(*rela));
+
+			list_add_tail(&rela->list, &sec->relas);
+
+			if (!gelf_getrela(sec->data, i, &rela->rela)) {
+				perror("gelf_getrela");
+				return -1;
+			}
+
+			rela->type = GELF_R_TYPE(rela->rela.r_info);
+			rela->addend = rela->rela.r_addend;
+			rela->offset = rela->rela.r_offset;
+			symndx = GELF_R_SYM(rela->rela.r_info);
+			rela->sym = elf_find_symbol_by_index(elf, symndx);
+			if (!rela->sym) {
+				WARN("can't find rela entry symbol %d for %s",
+				     symndx, sec->name);
+				return -1;
+			}
+		}
+	}
+
+	return 0;
+}
+
+struct elf *elf_open(const char *name)
+{
+	struct elf *elf;
+
+	elf_version(EV_CURRENT);
+
+	elf = malloc(sizeof(*elf));
+	if (!elf) {
+		perror("malloc");
+		return NULL;
+	}
+	memset(elf, 0, sizeof(*elf));
+
+	INIT_LIST_HEAD(&elf->sections);
+
+	elf->name = strdup(name);
+	if (!elf->name) {
+		perror("strdup");
+		goto err;
+	}
+
+	elf->fd = open(name, O_RDONLY);
+	if (elf->fd == -1) {
+		perror("open");
+		goto err;
+	}
+
+	elf->elf = elf_begin(elf->fd, ELF_C_READ_MMAP, NULL);
+	if (!elf->elf) {
+		perror("elf_begin");
+		goto err;
+	}
+
+	if (!gelf_getehdr(elf->elf, &elf->ehdr)) {
+		perror("gelf_getehdr");
+		goto err;
+	}
+
+	if (elf_read_sections(elf))
+		goto err;
+
+	if (elf_read_symbols(elf))
+		goto err;
+
+	if (elf_read_relas(elf))
+		goto err;
+
+	return elf;
+
+err:
+	elf_close(elf);
+	return NULL;
+}
+
+void elf_close(struct elf *elf)
+{
+	struct section *sec, *tmpsec;
+	struct symbol *sym, *tmpsym;
+
+	list_for_each_entry_safe(sec, tmpsec, &elf->sections, list) {
+		list_for_each_entry_safe(sym, tmpsym, &sec->symbols, list) {
+			list_del(&sym->list);
+			free(sym);
+		}
+		list_del(&sec->list);
+		free(sec);
+	}
+	if (elf->name)
+		free(elf->name);
+	if (elf->fd > 0)
+		close(elf->fd);
+	if (elf->elf)
+		elf_end(elf->elf);
+	free(elf);
+}
diff --git a/scripts/stackvalidate/elf.h b/scripts/stackvalidate/elf.h
new file mode 100644
index 0000000..db5d5fa
--- /dev/null
+++ b/scripts/stackvalidate/elf.h
@@ -0,0 +1,56 @@
+#ifndef _ELF_H_
+#define _ELF_H_
+
+#include <gelf.h>
+#include "list.h"
+
+#define WARN(format, ...) \
+	fprintf(stderr, \
+		"%s: " format "\n", \
+		elf->name, ##__VA_ARGS__)
+
+struct section {
+	struct list_head list;
+	GElf_Shdr sh;
+	struct list_head symbols;
+	struct list_head relas;
+	struct section *base, *rela;
+	Elf_Data *data;
+	char *name;
+	int index;
+	unsigned long start, end;
+};
+
+struct symbol {
+	struct list_head list;
+	GElf_Sym sym;
+	struct section *sec;
+	char *name;
+	int index;
+	unsigned char bind, type;
+	unsigned long start, end;
+};
+
+struct rela {
+	struct list_head list;
+	GElf_Rela rela;
+	struct symbol *sym;
+	unsigned int type;
+	int offset;
+	int addend;
+};
+
+struct elf {
+	Elf *elf;
+	GElf_Ehdr ehdr;
+	int fd;
+	char *name;
+	struct list_head sections;
+};
+
+
+struct elf *elf_open(const char *name);
+struct section *elf_find_section_by_name(struct elf *elf, const char *name);
+void elf_close(struct elf *elf);
+
+#endif /* _ELF_H_ */
diff --git a/scripts/stackvalidate/list.h b/scripts/stackvalidate/list.h
new file mode 100644
index 0000000..25716b5
--- /dev/null
+++ b/scripts/stackvalidate/list.h
@@ -0,0 +1,217 @@
+#ifndef _LIST_H
+#define _LIST_H
+
+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+
+#define container_of(ptr, type, member) ({ \
+	const typeof(((type *)0)->member) *__mptr = (ptr); \
+	(type *)((char *)__mptr - offsetof(type, member)); })
+
+#define LIST_POISON1 ((void *) 0x00100100)
+#define LIST_POISON2 ((void *) 0x00200200)
+
+struct list_head {
+	struct list_head *next, *prev;
+};
+
+#define LIST_HEAD_INIT(name) { &(name), &(name) }
+
+#define LIST_HEAD(name) \
+	struct list_head name = LIST_HEAD_INIT(name)
+
+static inline void INIT_LIST_HEAD(struct list_head *list)
+{
+	list->next = list;
+	list->prev = list;
+}
+
+static inline void __list_add(struct list_head *new,
+			      struct list_head *prev,
+			      struct list_head *next)
+{
+	next->prev = new;
+	new->next = next;
+	new->prev = prev;
+	prev->next = new;
+}
+
+static inline void list_add(struct list_head *new, struct list_head *head)
+{
+	__list_add(new, head, head->next);
+}
+
+static inline void list_add_tail(struct list_head *new, struct list_head *head)
+{
+	__list_add(new, head->prev, head);
+}
+
+static inline void __list_del(struct list_head *prev, struct list_head *next)
+{
+	next->prev = prev;
+	prev->next = next;
+}
+
+static inline void __list_del_entry(struct list_head *entry)
+{
+	__list_del(entry->prev, entry->next);
+}
+
+static inline void list_del(struct list_head *entry)
+{
+	__list_del(entry->prev, entry->next);
+	entry->next = LIST_POISON1;
+	entry->prev = LIST_POISON2;
+}
+
+static inline void list_replace(struct list_head *old,
+				struct list_head *new)
+{
+	new->next = old->next;
+	new->next->prev = new;
+	new->prev = old->prev;
+	new->prev->next = new;
+}
+
+static inline void list_replace_init(struct list_head *old,
+					struct list_head *new)
+{
+	list_replace(old, new);
+	INIT_LIST_HEAD(old);
+}
+
+static inline void list_del_init(struct list_head *entry)
+{
+	__list_del_entry(entry);
+	INIT_LIST_HEAD(entry);
+}
+
+static inline void list_move(struct list_head *list, struct list_head *head)
+{
+	__list_del_entry(list);
+	list_add(list, head);
+}
+
+static inline void list_move_tail(struct list_head *list,
+				  struct list_head *head)
+{
+	__list_del_entry(list);
+	list_add_tail(list, head);
+}
+
+static inline int list_is_last(const struct list_head *list,
+				const struct list_head *head)
+{
+	return list->next == head;
+}
+
+static inline int list_empty(const struct list_head *head)
+{
+	return head->next == head;
+}
+
+static inline int list_empty_careful(const struct list_head *head)
+{
+	struct list_head *next = head->next;
+
+	return (next == head) && (next == head->prev);
+}
+
+static inline void list_rotate_left(struct list_head *head)
+{
+	struct list_head *first;
+
+	if (!list_empty(head)) {
+		first = head->next;
+		list_move_tail(first, head);
+	}
+}
+
+static inline int list_is_singular(const struct list_head *head)
+{
+	return !list_empty(head) && (head->next == head->prev);
+}
+
+#define list_entry(ptr, type, member) \
+	container_of(ptr, type, member)
+
+#define list_first_entry(ptr, type, member) \
+	list_entry((ptr)->next, type, member)
+
+#define list_last_entry(ptr, type, member) \
+	list_entry((ptr)->prev, type, member)
+
+#define list_first_entry_or_null(ptr, type, member) \
+	(!list_empty(ptr) ? list_first_entry(ptr, type, member) : NULL)
+
+#define list_next_entry(pos, member) \
+	list_entry((pos)->member.next, typeof(*(pos)), member)
+
+#define list_prev_entry(pos, member) \
+	list_entry((pos)->member.prev, typeof(*(pos)), member)
+
+#define list_for_each(pos, head) \
+	for (pos = (head)->next; pos != (head); pos = pos->next)
+
+#define list_for_each_prev(pos, head) \
+	for (pos = (head)->prev; pos != (head); pos = pos->prev)
+
+#define list_for_each_safe(pos, n, head) \
+	for (pos = (head)->next, n = pos->next; pos != (head); \
+		pos = n, n = pos->next)
+
+#define list_for_each_prev_safe(pos, n, head) \
+	for (pos = (head)->prev, n = pos->prev; \
+	     pos != (head); \
+	     pos = n, n = pos->prev)
+
+#define list_for_each_entry(pos, head, member)				\
+	for (pos = list_first_entry(head, typeof(*pos), member);	\
+	     &pos->member != (head);					\
+	     pos = list_next_entry(pos, member))
+
+#define list_for_each_entry_reverse(pos, head, member)			\
+	for (pos = list_last_entry(head, typeof(*pos), member);		\
+	     &pos->member != (head);					\
+	     pos = list_prev_entry(pos, member))
+
+#define list_prepare_entry(pos, head, member) \
+	((pos) ? : list_entry(head, typeof(*pos), member))
+
+#define list_for_each_entry_continue(pos, head, member)			\
+	for (pos = list_next_entry(pos, member);			\
+	     &pos->member != (head);					\
+	     pos = list_next_entry(pos, member))
+
+#define list_for_each_entry_continue_reverse(pos, head, member)		\
+	for (pos = list_prev_entry(pos, member);			\
+	     &pos->member != (head);					\
+	     pos = list_prev_entry(pos, member))
+
+#define list_for_each_entry_from(pos, head, member)			\
+	for (; &pos->member != (head);					\
+	     pos = list_next_entry(pos, member))
+
+#define list_for_each_entry_safe(pos, n, head, member)			\
+	for (pos = list_first_entry(head, typeof(*pos), member),	\
+		n = list_next_entry(pos, member);			\
+	     &pos->member != (head);					\
+	     pos = n, n = list_next_entry(n, member))
+
+#define list_for_each_entry_safe_continue(pos, n, head, member)		\
+	for (pos = list_next_entry(pos, member),			\
+		n = list_next_entry(pos, member);			\
+	     &pos->member != (head);					\
+	     pos = n, n = list_next_entry(n, member))
+
+#define list_for_each_entry_safe_from(pos, n, head, member)		\
+	for (n = list_next_entry(pos, member);				\
+	     &pos->member != (head);					\
+	     pos = n, n = list_next_entry(n, member))
+
+#define list_for_each_entry_safe_reverse(pos, n, head, member)		\
+	for (pos = list_last_entry(head, typeof(*pos), member),		\
+		n = list_prev_entry(pos, member);			\
+	     &pos->member != (head);					\
+	     pos = n, n = list_prev_entry(n, member))
+
+#endif /* _LIST_H */
diff --git a/scripts/stackvalidate/stackvalidate.c b/scripts/stackvalidate/stackvalidate.c
new file mode 100644
index 0000000..07f1110
--- /dev/null
+++ b/scripts/stackvalidate/stackvalidate.c
@@ -0,0 +1,226 @@
+/*
+ * stackvalidate.c
+ *
+ * Copyright (C) 2015 Josh Poimboeuf <jpoimboe@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * This tool automatically runs for every compiled .S file and validates that
+ * every asm function does the proper frame pointer setup.
+ *
+ * Also, to make sure somebody didn't forget to annotate their callable asm
+ * code as a function (e.g. via the FUNC_ENTER/FUNC_RETURN macros), it flags an
+ * error for any return instructions which are hiding outside of a function.
+ * In almost all cases, return instructions are part of callable functions and
+ * should be annotated as such so that we can validate their frame pointer
+ * usage.
+ *
+ * Whitelist mechanisms exist (RET_NOVALIDATE and FILE_NOVALIDATE) for those
+ * few return instructions which are not actually in callable code.
+ */
+
+#include <argp.h>
+#include <stdbool.h>
+
+#include "elf.h"
+#include "arch.h"
+
+int warnings;
+
+struct args {
+	char *args[1];
+};
+static const char args_doc[] = "file.o";
+static struct argp_option options[] = {
+	{0},
+};
+static error_t parse_opt(int key, char *arg, struct argp_state *state)
+{
+	/* Get the input argument from argp_parse, which we
+	   know is a pointer to our args structure. */
+	struct args *args = state->input;
+
+	switch (key) {
+	case ARGP_KEY_ARG:
+		if (state->arg_num >= 1)
+			/* Too many arguments. */
+			argp_usage(state);
+		args->args[state->arg_num] = arg;
+		break;
+	case ARGP_KEY_END:
+		if (state->arg_num < 1)
+			/* Not enough arguments. */
+			argp_usage(state);
+		break;
+	default:
+		return ARGP_ERR_UNKNOWN;
+	}
+	return 0;
+}
+static struct argp argp = { options, parse_opt, args_doc, 0 };
+
+/*
+ * Check for the RET_NOVALIDATE macro.
+ */
+static bool is_ret_whitelisted(struct elf *elf, struct section *sec,
+			       unsigned long offset)
+{
+	struct section *wlsec;
+	struct rela *rela;
+
+	wlsec = elf_find_section_by_name(elf,
+					 ".rela__stackvalidate_whitelist_ret");
+	if (!wlsec)
+		return false;
+
+	list_for_each_entry(rela, &wlsec->relas, list)
+		if (rela->sym->type == STT_SECTION &&
+		    rela->sym->index == sec->index && rela->addend == offset)
+			return true;
+
+	return false;
+}
+
+/*
+ * Check for the FILE_NOVALIDATE macro.
+ */
+static bool is_file_whitelisted(struct elf *elf)
+{
+	if (elf_find_section_by_name(elf, "__stackvalidate_whitelist_file"))
+		return true;
+
+	return false;
+}
+
+/*
+ * For the given collection of instructions which are outside an STT_FUNC
+ * function, ensure there are no (whitelisted) return instructions.
+ */
+static int validate_nonfunction(struct elf *elf, struct section *sec,
+				unsigned long start, unsigned long end)
+{
+	unsigned long addr;
+	unsigned int len;
+	int ret, warnings = 0;
+
+	for (addr = start; addr < end; addr += len) {
+		ret = arch_is_return_insn(elf, addr, end - addr, &len);
+		if (ret == -1)
+			return -1;
+
+		if (ret && !is_ret_whitelisted(elf, sec, addr - sec->start)) {
+			WARN("return instruction outside of a function at %s+0x%lx.  Please use FUNC_ENTER.",
+			     sec->name, addr - sec->start);
+			warnings++;
+		}
+	}
+
+	return 0;
+}
+
+/*
+ * For the given section, ensure that:
+ *
+ * 1) all STT_FUNC functions do the proper frame pointer setup; and
+ * 2) any other instructions outside of STT_FUNC aren't return instructions
+ *    (unless they're annotated with the RET_NOVALIDATE macro).
+ */
+static int validate_section(struct elf *elf, struct section *sec)
+{
+	struct symbol *func, *last_func;
+	struct symbol null_func = {};
+	int ret, warnings = 0;
+
+	if (!(sec->sh.sh_flags & SHF_EXECINSTR))
+		return 0;
+
+	if (list_empty(&sec->symbols)) {
+		WARN("%s: no symbols", sec->name);
+		return -1;
+	}
+
+	last_func = &null_func;
+	last_func->start = last_func->end = sec->start;
+	list_for_each_entry(func, &sec->symbols, list) {
+		if (func->type != STT_FUNC)
+			continue;
+
+		if (func->start != last_func->start &&
+		    func->end != last_func->end &&
+		    func->start < last_func->end) {
+			WARN("overlapping functions %s and %s",
+			     last_func->name, func->name);
+			warnings++;
+		}
+
+		if (func->start > last_func->end) {
+			ret = validate_nonfunction(elf, sec, last_func->end,
+						   func->start);
+			if (ret < 0)
+				return -1;
+
+			warnings += ret;
+		}
+
+		ret = arch_validate_function(elf, func);
+		if (ret < 0)
+			return -1;
+
+		warnings += ret;
+
+		last_func = func;
+	}
+
+	if (last_func->end < sec->end) {
+		ret = validate_nonfunction(elf, sec, last_func->end, sec->end);
+		if (ret < 0)
+			return -1;
+
+		warnings += ret;
+	}
+
+	return warnings;
+}
+
+int main(int argc, char *argv[])
+{
+	struct args args;
+	struct elf *elf;
+	struct section *sec;
+	int ret, warnings = 0;
+
+	argp_parse(&argp, argc, argv, 0, 0, &args);
+
+	elf = elf_open(args.args[0]);
+	if (!elf) {
+		fprintf(stderr, "error reading elf file %s\n", args.args[0]);
+		return 1;
+	}
+
+	if (is_file_whitelisted(elf))
+		return 0;
+
+	list_for_each_entry(sec, &elf->sections, list) {
+		ret = validate_section(elf, sec);
+		if (ret < 0)
+			return 1;
+
+		warnings += ret;
+	}
+
+	/* ignore warnings for now until we get all the asm code cleaned up */
+	return 0;
+}
-- 
2.1.0


  reply	other threads:[~2015-05-18 16:34 UTC|newest]

Thread overview: 710+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-18 16:34 [PATCH v4 0/3] Compile-time stack frame pointer validation Josh Poimboeuf
2015-05-18 16:34 ` Josh Poimboeuf [this message]
2015-05-18 16:34 ` [PATCH v4 2/3] x86: Make push/pop CFI macros arch-independent Josh Poimboeuf
2015-05-18 16:34 ` [PATCH v4 3/3] x86, stackvalidate: Add asm frame pointer setup macros Josh Poimboeuf
2015-05-20 10:33 ` [PATCH v4 0/3] Compile-time stack frame pointer validation Ingo Molnar
2015-05-20 14:13   ` Josh Poimboeuf
2015-05-20 14:48     ` Ingo Molnar
2015-05-20 15:51       ` Josh Poimboeuf
2015-05-20 16:09         ` Josh Poimboeuf
2015-05-20 16:03       ` Andy Lutomirski
2015-05-20 16:25         ` Josh Poimboeuf
2015-05-20 16:39           ` Andy Lutomirski
2015-05-20 16:52           ` Borislav Petkov
2015-05-21 10:16             ` Ingo Molnar
2015-05-21 10:47               ` Borislav Petkov
2015-05-21 11:11                 ` Ingo Molnar
2015-05-21 15:49                   ` [PATCH 1/3] x86/documentation: Move kernel-stacks doc one level up Borislav Petkov
2015-05-21 15:49                     ` [PATCH 2/3] x86/documentation: Remove STACKFAULT_STACK bulletpoint Borislav Petkov
2015-05-21 15:49                     ` [PATCH 3/3] x86/documentation: Adapt Ingo's explanation on printing backtraces Borislav Petkov
2015-05-27 14:17               ` [tip:x86/debug] x86/Documentation: Adapt Ingo' s " tip-bot for Borislav Petkov
2015-05-20 16:59           ` [PATCH v4 0/3] Compile-time stack frame pointer validation Linus Torvalds
2015-05-20 17:20             ` Josh Poimboeuf
2015-05-21 10:27               ` Ingo Molnar
2015-05-21  7:52             ` Ingo Molnar
2015-05-21 12:12               ` Ingo Molnar
2015-05-26 23:06               ` Andi Kleen
2015-05-20 17:27         ` Peter Zijlstra
2015-05-20 19:10           ` Jiri Kosina
2015-05-21 20:54       ` Josh Poimboeuf
2015-05-21 21:53         ` Andy Lutomirski
2015-05-22 14:53           ` Josh Poimboeuf
2015-05-21 22:01         ` Borislav Petkov
2015-05-22 14:32           ` Josh Poimboeuf
2015-05-22 21:18             ` Jiri Kosina
2015-05-22 22:22               ` Josh Poimboeuf
2015-05-23  8:37             ` Borislav Petkov
  -- strict thread matches above, loose matches on Subject: below --
2015-05-26  8:28 [PATCH 00/18] tip queue 2015-05-26 Borislav Petkov
2015-05-26  8:28 ` [PATCH 01/18] x86/kconfig: Simplify conditions for HAVE_ARCH_HUGE_VMAP Borislav Petkov
2015-05-27 14:17   ` [tip:x86/mm] x86/mm/kconfig: " tip-bot for Toshi Kani
2015-05-27 14:17     ` tip-bot for Toshi Kani
2015-05-26  8:28 ` [PATCH 02/18] x86/mtrr: Fix MTRR lookup to handle an inclusive entry Borislav Petkov
2015-05-27 14:18   ` [tip:x86/mm] x86/mm/mtrr: " tip-bot for Toshi Kani
2015-05-27 14:18     ` tip-bot for Toshi Kani
2015-05-26  8:28 ` [PATCH 03/18] x86/mtrr: Fix MTRR state checks in mtrr_type_lookup() Borislav Petkov
2015-05-27 14:18   ` [tip:x86/mm] x86/mm/mtrr: " tip-bot for Toshi Kani
2015-05-27 14:18     ` tip-bot for Toshi Kani
2015-05-26  8:28 ` [PATCH 04/18] x86/mtrr: Use symbolic define as a retval for disabled MTRRs Borislav Petkov
2015-05-27 14:18   ` [tip:x86/mm] x86/mm/mtrr: " tip-bot for Toshi Kani
2015-05-27 14:18     ` tip-bot for Toshi Kani
2015-05-26  8:28 ` [PATCH 05/18] x86/mtrr: Clean up mtrr_type_lookup() Borislav Petkov
2015-05-27 14:19   ` [tip:x86/mm] x86/mm/mtrr: " tip-bot for Toshi Kani
2015-05-27 14:19     ` tip-bot for Toshi Kani
2015-07-31 13:18     ` Peter Zijlstra
2015-07-31 13:18       ` Peter Zijlstra
2015-07-31 14:44       ` Borislav Petkov
2015-07-31 15:08         ` Peter Zijlstra
2015-07-31 15:08           ` Peter Zijlstra
2015-07-31 15:27           ` Borislav Petkov
2015-08-01 14:28             ` Luis R. Rodriguez
2015-08-01 14:28               ` Luis R. Rodriguez
2015-08-01 16:33               ` Borislav Petkov
2015-08-01 16:33                 ` Borislav Petkov
2015-08-01 16:39                 ` Linus Torvalds
2015-08-01 16:39                   ` Linus Torvalds
2015-08-01 16:49                   ` Borislav Petkov
2015-08-01 16:49                     ` Borislav Petkov
2015-08-01 17:03                     ` Linus Torvalds
2015-08-01 17:03                       ` Linus Torvalds
2015-05-26  8:28 ` [PATCH 06/18] x86/process: Drop repeated word from comment Borislav Petkov
2015-05-27 14:16   ` [tip:sched/core] sched/x86: Drop repeated word from mwait_idle() comment tip-bot for Huang Rui
2015-05-26  8:28 ` [PATCH 07/18] x86/mm: Enhance MTRR checks in kernel mapping helpers Borislav Petkov
2015-05-27 14:19   ` [tip:x86/mm] x86/mm/mtrr: " tip-bot for Toshi Kani
2015-05-27 14:19     ` tip-bot for Toshi Kani
2015-05-26  8:28 ` [PATCH 08/18] x86/mm/pat: Convert to pr_* usage Borislav Petkov
2015-05-27 14:19   ` [tip:x86/mm] x86/mm/pat: Convert to pr_*() usage tip-bot for Luis R. Rodriguez
2015-05-26  8:28 ` [PATCH 09/18] x86: Document Write Combining MTRR type effects on PAT / non-PAT pages Borislav Petkov
2015-05-27 14:19   ` [tip:x86/mm] x86/mm/mtrr, pat: " tip-bot for Luis R. Rodriguez
2015-05-26  8:28 ` [PATCH 10/18] x86/mtrr: Avoid ifdeffery with phys_wc_to_mtrr_index() Borislav Petkov
2015-05-27 14:20   ` [tip:x86/mm] x86/mm/mtrr: Avoid #ifdeffery " tip-bot for Luis R. Rodriguez
2015-05-26  8:28 ` [PATCH 11/18] x86/mtrr: Generalize runtime disabling of MTRRs Borislav Petkov
2015-05-27 14:20   ` [tip:x86/mm] x86/mm/mtrr: " tip-bot for Luis R. Rodriguez
2015-05-26  8:28 ` [PATCH 12/18] x86/mm/pat: Wrap pat_enabled Borislav Petkov
2015-05-27 14:20   ` [tip:x86/mm] x86/mm/pat: Wrap pat_enabled into a function API tip-bot for Luis R. Rodriguez
2015-05-26  8:28 ` [PATCH 13/18] x86/mm/pat: Export pat_enabled() Borislav Petkov
2015-05-27 14:21   ` [tip:x86/mm] " tip-bot for Luis R. Rodriguez
2015-05-26  8:28 ` [PATCH 14/18] x86/cpu: Strip any /proc/cpuinfo model name field whitespace Borislav Petkov
2015-05-27 14:16   ` [tip:x86/cpu] x86/cpu: Strip any /proc/ cpuinfo " tip-bot for Prarit Bhargava
2015-05-27 17:07     ` Joe Perches
2015-05-27 19:06       ` Borislav Petkov
2015-05-27 19:16         ` Joe Perches
2015-05-28 11:27           ` Prarit Bhargava
2015-05-28 11:32             ` Borislav Petkov
2015-05-28 12:58               ` Borislav Petkov
2015-05-28 16:57                 ` H. Peter Anvin
2015-05-28 18:33                   ` Borislav Petkov
2015-05-28 20:39                     ` H. Peter Anvin
2015-05-26  8:28 ` [PATCH 15/18] x86/documentation: Move kernel-stacks doc one level up Borislav Petkov
2015-05-27 14:17   ` [tip:x86/debug] x86/Documentation: " tip-bot for Borislav Petkov
2015-05-26  8:28 ` [PATCH 16/18] x86/documentation: Remove STACKFAULT_STACK bulletpoint Borislav Petkov
2015-05-27 14:17   ` [tip:x86/debug] x86/Documentation: " tip-bot for Borislav Petkov
2015-05-26  8:28 ` [PATCH 17/18] x86/documentation: Adapt Ingo's explanation on printing backtraces Borislav Petkov
2015-05-26  8:28 ` [PATCH 18/18] x86/mce: Fix monarch timeout setting through the mce= cmdline option Borislav Petkov
2015-06-07 17:39   ` [tip:x86/core] " tip-bot for Xie XiuQi
2015-05-20 11:22 [PATCH] mce: fix fail to set 'monarchtimeout' via boot option Xie XiuQi
2015-05-20 17:43 ` Borislav Petkov
2015-05-21  1:00   ` Xie XiuQi
2015-05-19 15:43 [PATCH] x86, cpuinfo x86_model_id whitespace cleanup Prarit Bhargava
2015-05-19 16:56 ` Borislav Petkov
2015-05-19 17:25 ` Brian Gerst
2015-05-19 18:13   ` Borislav Petkov
2015-05-19 18:44     ` Andy Lutomirski
2015-05-19 19:22       ` Borislav Petkov
2015-05-19 20:16         ` Andy Lutomirski
2015-05-19 20:26           ` Joe Perches
2015-05-19 20:28             ` Joe Perches
2015-05-19 20:31           ` Borislav Petkov
2015-05-19 22:17             ` Prarit Bhargava
2015-05-27 17:18         ` H. Peter Anvin
2015-05-20  6:34 ` Ingo Molnar
2015-05-20 10:15   ` Prarit Bhargava
2015-06-02  8:42 ` [tip:x86/cpu] x86/cpu: Trim model ID whitespace tip-bot for Borislav Petkov
2015-05-19  8:01 [RFC PATCH 0/4] x86, mwaitt: introduce AMD mwaitt support Huang Rui
2015-05-19  8:01 ` [RFC PATCH 1/4] x86, mwaitt: add monitorx and mwaitx instruction Huang Rui
2015-05-19 11:29   ` Borislav Petkov
2015-05-21  8:54     ` Huang Rui
2015-05-21  9:35       ` Borislav Petkov
2015-05-19  8:01 ` [RFC PATCH 2/4] x86, mwaitt: introduce mwaitx idle with a configurable timer Huang Rui
2015-05-19 11:31   ` Borislav Petkov
2015-05-20  8:55     ` Ingo Molnar
2015-05-20  9:12       ` Borislav Petkov
2015-05-20 10:22         ` Ingo Molnar
2015-05-20 10:50           ` Borislav Petkov
2015-05-20 11:11             ` Ingo Molnar
2015-05-20 11:21               ` Borislav Petkov
2015-05-20 11:41                 ` Ingo Molnar
2015-05-20 13:20                   ` Thomas Gleixner
2015-05-20 14:51                     ` Ingo Molnar
2015-05-20 15:55                       ` One Thousand Gnomes
2015-05-20 16:07                         ` Borislav Petkov
2015-05-20 19:12                           ` Thomas Gleixner
2015-05-20 20:15                             ` Borislav Petkov
2015-05-21 14:56                               ` Huang Rui
2015-05-21 16:02                                 ` Borislav Petkov
2015-05-21 16:45                                   ` Andy Lutomirski
2015-05-21 17:08                                     ` Borislav Petkov
2015-05-21 17:12                                       ` Andy Lutomirski
2015-05-21 19:30                                   ` Thomas Gleixner
2015-05-21 14:32                 ` Huang Rui
2015-05-25  2:42               ` Huang Rui
2015-05-25 10:43                 ` Ingo Molnar
2015-05-21 14:15         ` Huang Rui
2015-05-21 13:26     ` Huang Rui
2015-05-21  1:34   ` Andy Lutomirski
2015-05-21  5:48     ` Andy Lutomirski
2015-05-27  1:01       ` Andy Lutomirski
2015-05-27 11:30         ` Borislav Petkov
2015-05-21  9:41     ` Thomas Gleixner
2015-05-19  8:01 ` [RFC PATCH 3/4] x86, mwaitt: add document to describe mwaitx Huang Rui
2015-05-19  8:01 ` [RFC PATCH 4/4] x86, mwait: fix redundant comment Huang Rui
2015-05-19  9:40   ` Borislav Petkov
2015-05-19  8:57 ` [RFC PATCH 0/4] x86, mwaitt: introduce AMD mwaitt support Borislav Petkov
2015-05-19  9:44   ` Huang Rui
2015-05-15 18:23 [PATCH v5 0/6] mtrr, mm, x86: Enhance MTRR checks for huge I/O mapping Toshi Kani
2015-05-15 18:23 ` Toshi Kani
2015-05-15 18:23 ` [PATCH v5 1/6] mm, x86: Simplify conditions of HAVE_ARCH_HUGE_VMAP Toshi Kani
2015-05-15 18:23   ` Toshi Kani
2015-05-17  8:30   ` Borislav Petkov
2015-05-15 18:23 ` [PATCH v5 2/6] mtrr, x86: Fix MTRR lookup to handle inclusive entry Toshi Kani
2015-05-15 18:23   ` Toshi Kani
2015-05-15 18:23 ` [PATCH v5 3/6] mtrr, x86: Fix MTRR state checks in mtrr_type_lookup() Toshi Kani
2015-05-15 18:23   ` Toshi Kani
2015-05-15 18:23 ` [PATCH v5 4/6] mtrr, x86: Define MTRR_TYPE_INVALID for mtrr_type_lookup() Toshi Kani
2015-05-15 18:23   ` Toshi Kani
2015-05-15 18:23 ` [PATCH v5 5/6] mtrr, x86: Clean up mtrr_type_lookup() Toshi Kani
2015-05-15 18:23   ` Toshi Kani
2015-05-15 18:23 ` [PATCH v5 6/6] mtrr, mm, x86: Enhance MTRR checks for KVA huge page mapping Toshi Kani
2015-05-15 18:23   ` Toshi Kani
2015-05-18 13:33   ` Borislav Petkov
2015-05-18 17:22     ` Toshi Kani
2015-05-18 17:22       ` Toshi Kani
2015-05-18 19:01       ` Borislav Petkov
2015-05-18 19:31         ` Toshi Kani
2015-05-18 19:31           ` Toshi Kani
2015-05-18 20:01           ` Borislav Petkov
2015-05-18 20:21             ` Toshi Kani
2015-05-18 20:21               ` Toshi Kani
2015-05-18 20:51               ` Borislav Petkov
2015-05-18 21:53                 ` Toshi Kani
2015-05-18 21:53                   ` Toshi Kani
2015-05-19 11:44                   ` Borislav Petkov
2015-05-19 13:23                     ` Borislav Petkov
2015-05-19 13:47                       ` Toshi Kani
2015-05-19 13:47                         ` Toshi Kani
2015-05-20 11:55                       ` Ingo Molnar
2015-05-20 11:55                         ` Ingo Molnar
2015-05-20 14:34                         ` Toshi Kani
2015-05-20 14:34                           ` Toshi Kani
2015-05-20 15:01                           ` Ingo Molnar
2015-05-20 15:01                             ` Ingo Molnar
2015-05-20 15:02                             ` Toshi Kani
2015-05-20 15:02                               ` Toshi Kani
2015-05-20 16:04                               ` Borislav Petkov
2015-05-20 15:46                                 ` Toshi Kani
2015-05-20 15:46                                   ` Toshi Kani
2015-05-11  8:15 [0/8] tip queue 2015-05-11 Borislav Petkov
2015-05-11  8:15 ` [PATCH] x86/alternatives: Switch AMD F15h and later to the P6 NOPs Borislav Petkov
2015-05-11 12:44   ` [tip:x86/asm] " tip-bot for Borislav Petkov
2015-05-11  8:15 ` [PATCH] x86/cpu/microcode: Zap changelog Borislav Petkov
2015-05-11 12:45   ` [tip:x86/microcode] " tip-bot for Borislav Petkov
2015-05-11  8:15 ` [PATCH] x86/kaslr: Fix typo in KASLR_FLAG documentation Borislav Petkov
2015-05-11 12:45   ` [tip:x86/boot] x86/kaslr: Fix typo in the " tip-bot for Miroslav Benes
2015-05-11  8:15 ` [PATCH 1/5] x86/mm: Do not flush last cacheline twice in clflush_cache_range() Borislav Petkov
2015-05-11 12:45   ` [tip:x86/mm] " tip-bot for Ross Zwisler
2015-05-11  8:15 ` [PATCH] x86/vdso: Add arch/x86/include/uapi include path to HOST_EXTRACFLAGS Borislav Petkov
2015-05-11  8:15 ` [PATCH 2/5] x86/mm: Add kerneldoc comments for pcommit_sfence() Borislav Petkov
2015-05-11 12:45   ` [tip:x86/mm] " tip-bot for Ross Zwisler
2015-05-11  8:15 ` [PATCH 3/5] x86/MTRR: Remove wrong address check in __mtrr_type_lookup() Borislav Petkov
2015-05-11 12:46   ` [tip:x86/mm] x86/mm/mtrr: Remove incorrect " tip-bot for Toshi Kani
2015-05-11 12:46     ` tip-bot for Toshi Kani
2015-05-11  8:15 ` [PATCH 4/5] x86/mm: Add ioremap_uc() helper to map memory uncacheable (not UC-) Borislav Petkov
2015-05-11 12:46   ` [tip:x86/mm] " tip-bot for Luis R. Rodriguez
2015-05-06 16:54 tools: Consolidate types.h Oleg Nesterov
2015-05-06 17:17 ` Borislav Petkov
2015-05-06 17:30   ` Oleg Nesterov
2015-05-06 17:37     ` Borislav Petkov
2015-05-07  2:53       ` Andy Lutomirski
2015-05-07 16:58         ` [PATCH 0/1] x86/vdso: add -Iarch/x86/include/uapi into HOST_EXTRACFLAGS Oleg Nesterov
2015-05-07 16:58           ` [PATCH 1/1] " Oleg Nesterov
2015-05-07 19:46             ` Andy Lutomirski
2015-05-07 21:55               ` Borislav Petkov
2015-05-11 12:44             ` [tip:x86/urgent] x86/vdso: Fix 'make bzImage' on older distros tip-bot for Oleg Nesterov
2015-04-30 20:25 [PATCH v5 0/6] x86: address drivers that do not work with PAT Luis R. Rodriguez
2015-04-30 20:25 ` [PATCH v5 1/6] x86/mm/pat: use pr_info() and friends Luis R. Rodriguez
2015-05-04 14:58   ` Borislav Petkov
2015-05-07  3:36   ` Elliott, Robert (Server Storage)
2015-05-14 15:55     ` Luis R. Rodriguez
2015-04-30 20:25 ` [PATCH v5 2/6] x86/mm/pat: redefine pat_enabled Luis R. Rodriguez
2015-05-04 15:22   ` Borislav Petkov
2015-05-05  0:42     ` Luis R. Rodriguez
2015-04-30 20:25 ` [PATCH v5 3/6] arch/x86/mm/pat: export pat_enabled() Luis R. Rodriguez
2015-05-04 15:29   ` Borislav Petkov
2015-04-30 20:25 ` [PATCH v5 4/6] ivtv: use arch_phys_wc_add() and require PAT disabled Luis R. Rodriguez
2015-04-30 20:25   ` Luis R. Rodriguez
2015-04-30 20:25   ` Luis R. Rodriguez
2015-04-30 20:25 ` [PATCH v5 5/6] IB/ipath: add counting for MTRR Luis R. Rodriguez
2015-04-30 20:25   ` Luis R. Rodriguez
2015-04-30 20:25 ` [PATCH v5 6/6] IB/ipath: use arch_phys_wc_add() and require PAT disabled Luis R. Rodriguez
2015-04-30 20:25   ` Luis R. Rodriguez
2015-04-30 20:25   ` Luis R. Rodriguez
2015-04-29 21:44 [PATCH v4 0/6] x86: document and address MTRR corner cases Luis R. Rodriguez
2015-04-29 21:44 ` [PATCH v4 1/6] x86: add ioremap_uc() - force strong UC, PCD=1, PWT=1 Luis R. Rodriguez
2015-04-29 21:44   ` Luis R. Rodriguez
2015-04-30 10:18   ` Borislav Petkov
2015-04-30 10:18     ` Borislav Petkov
2015-04-29 21:44 ` [PATCH v4 2/6] x86: document WC MTRR effects on PAT / non-PAT pages Luis R. Rodriguez
2015-04-29 21:44   ` Luis R. Rodriguez
2015-04-30 22:01   ` Randy Dunlap
2015-04-30 22:01     ` Randy Dunlap
2015-05-05  0:45     ` Luis R. Rodriguez
2015-05-05  0:45       ` Luis R. Rodriguez
2015-05-05  7:22       ` Borislav Petkov
2015-05-05  7:22         ` Borislav Petkov
2015-05-05  7:46         ` Luis R. Rodriguez
2015-05-05  7:46           ` Luis R. Rodriguez
2015-05-05  7:53           ` Borislav Petkov
2015-05-05  7:53             ` Borislav Petkov
2015-05-05  7:31     ` Luis R. Rodriguez
2015-05-05  7:31       ` Luis R. Rodriguez
2015-05-04 12:23   ` Borislav Petkov
2015-05-04 12:23     ` Borislav Petkov
2015-05-05  7:35     ` Luis R. Rodriguez
2015-05-05  7:35       ` Luis R. Rodriguez
2015-04-29 21:44 ` [PATCH v4 3/6] video: fbdev: atyfb: move framebuffer length fudging to helper Luis R. Rodriguez
2015-04-29 21:44   ` Luis R. Rodriguez
2015-04-29 21:44 ` [PATCH v4 4/6] video: fbdev: atyfb: clarify ioremap() base and length used Luis R. Rodriguez
2015-04-29 21:44   ` Luis R. Rodriguez
2015-04-29 21:44 ` [PATCH v4 5/6] video: fbdev: atyfb: replace MTRR UC hole with strong UC Luis R. Rodriguez
2015-04-29 21:44   ` Luis R. Rodriguez
2015-04-29 21:44 ` [PATCH v4 6/6] video: fbdev: atyfb: use arch_phys_wc_add() and ioremap_wc() Luis R. Rodriguez
2015-04-29 21:44   ` Luis R. Rodriguez
2015-05-20 19:53   ` Luis R. Rodriguez
2015-05-20 19:53     ` Luis R. Rodriguez
2015-05-20 20:57     ` Luis R. Rodriguez
2015-05-20 20:57       ` Luis R. Rodriguez
2015-06-03 23:50 ` [PATCH v4 0/6] x86: document and address MTRR corner cases Luis R. Rodriguez
2015-06-03 23:50   ` [Cocci] " Luis R. Rodriguez
2015-06-08 23:43   ` Luis R. Rodriguez
2015-06-08 23:43     ` [Cocci] " Luis R. Rodriguez
2015-06-16 19:31     ` Luis R. Rodriguez
2015-06-16 19:31       ` [Cocci] " Luis R. Rodriguez
2015-06-19 22:22       ` Luis R. Rodriguez
2015-06-25  1:24         ` Luis R. Rodriguez
2015-06-25  6:59           ` Ingo Molnar
2015-06-25 16:41             ` Luis R. Rodriguez
2015-04-28 22:46 [PATCH v2] x86: Add kerneldoc for pcommit_sfence() Ross Zwisler
2015-04-29 14:23 ` Borislav Petkov
2015-04-28 22:13 [PATCH] x86: improve algorithm in clflush_cache_range Ross Zwisler
2015-04-29 10:28 ` Borislav Petkov
2015-04-22 17:12 [PATCH v4] mtrr: avoid ifdef'ery with phys_wc_to_mtrr_index() Luis R. Rodriguez
2015-04-22 17:12 ` Luis R. Rodriguez
2015-04-22 17:12 ` Luis R. Rodriguez
2015-04-14 11:35 [PATCH] x86/kaslr: Fix typo in documentation Miroslav Benes
2015-04-14 11:37 ` Borislav Petkov
2015-03-24 22:08 [PATCH v4 0/7] mtrr, mm, x86: Enhance MTRR checks for huge I/O mapping Toshi Kani
2015-03-24 22:08 ` Toshi Kani
2015-03-24 22:08 ` [PATCH v4 1/7] mm, x86: Document return values of mapping funcs Toshi Kani
2015-03-24 22:08   ` Toshi Kani
2015-05-05 11:19   ` Borislav Petkov
2015-05-05 11:19     ` Borislav Petkov
2015-05-05 13:46     ` Toshi Kani
2015-05-05 13:46       ` Toshi Kani
2015-05-05 14:19       ` Borislav Petkov
2015-05-05 14:19         ` Borislav Petkov
2015-05-05 14:14         ` Toshi Kani
2015-05-05 14:14           ` Toshi Kani
2015-03-24 22:08 ` [PATCH v4 2/7] mtrr, x86: Fix MTRR lookup to handle inclusive entry Toshi Kani
2015-03-24 22:08   ` Toshi Kani
2015-05-05 17:11   ` Borislav Petkov
2015-05-05 17:11     ` Borislav Petkov
2015-05-05 17:32     ` Toshi Kani
2015-05-05 17:32       ` Toshi Kani
2015-05-05 18:39       ` Borislav Petkov
2015-05-05 18:39         ` Borislav Petkov
2015-05-05 19:31         ` Toshi Kani
2015-05-05 19:31           ` Toshi Kani
2015-05-05 20:09           ` Borislav Petkov
2015-05-05 20:09             ` Borislav Petkov
2015-05-05 20:06             ` Toshi Kani
2015-05-05 20:06               ` Toshi Kani
2015-03-24 22:08 ` [PATCH v4 3/7] mtrr, x86: Remove a wrong address check in __mtrr_type_lookup() Toshi Kani
2015-03-24 22:08   ` Toshi Kani
2015-05-06 10:46   ` Borislav Petkov
2015-05-06 10:46     ` Borislav Petkov
2015-03-24 22:08 ` [PATCH v4 4/7] mtrr, x86: Fix MTRR state checks in mtrr_type_lookup() Toshi Kani
2015-03-24 22:08   ` Toshi Kani
2015-05-06 11:47   ` Borislav Petkov
2015-05-06 11:47     ` Borislav Petkov
2015-05-06 15:23     ` Toshi Kani
2015-05-06 15:23       ` Toshi Kani
2015-05-06 22:39       ` Borislav Petkov
2015-05-06 22:39         ` Borislav Petkov
2015-05-06 23:08         ` Toshi Kani
2015-05-06 23:08           ` Toshi Kani
2015-03-24 22:08 ` [PATCH v4 5/7] mtrr, x86: Define MTRR_TYPE_INVALID for mtrr_type_lookup() Toshi Kani
2015-03-24 22:08   ` Toshi Kani
2015-03-24 22:08 ` [PATCH v4 6/7] mtrr, x86: Clean up mtrr_type_lookup() Toshi Kani
2015-03-24 22:08   ` Toshi Kani
2015-05-06 13:41   ` Borislav Petkov
2015-05-06 13:41     ` Borislav Petkov
2015-05-06 16:00     ` Toshi Kani
2015-05-06 16:00       ` Toshi Kani
2015-05-06 22:49       ` Borislav Petkov
2015-05-06 22:49         ` Borislav Petkov
2015-05-06 23:42         ` Toshi Kani
2015-05-06 23:42           ` Toshi Kani
2015-05-07  7:52           ` Borislav Petkov
2015-05-07  7:52             ` Borislav Petkov
2015-05-07 13:45             ` Toshi Kani
2015-05-07 13:45               ` Toshi Kani
2015-03-24 22:08 ` [PATCH v4 7/7] mtrr, mm, x86: Enhance MTRR checks for KVA huge page mapping Toshi Kani
2015-03-24 22:08   ` Toshi Kani
2015-05-09  9:08   ` Borislav Petkov
2015-05-09  9:08     ` Borislav Petkov
2015-05-11 19:25     ` Toshi Kani
2015-05-11 19:25       ` Toshi Kani
2015-05-11 20:18       ` Borislav Petkov
2015-05-11 20:18         ` Borislav Petkov
2015-05-11 20:38         ` Toshi Kani
2015-05-11 20:38           ` Toshi Kani
2015-05-11 21:42           ` Borislav Petkov
2015-05-11 21:42             ` Borislav Petkov
2015-05-11 22:09             ` Toshi Kani
2015-05-11 22:09               ` Toshi Kani
2015-05-12  7:28               ` Borislav Petkov
2015-05-12  7:28                 ` Borislav Petkov
2015-05-12 14:30                 ` Toshi Kani
2015-05-12 14:30                   ` Toshi Kani
2015-05-12 16:31                   ` Borislav Petkov
2015-05-12 16:31                     ` Borislav Petkov
2015-05-12 16:57                     ` Toshi Kani
2015-05-12 16:57                       ` Toshi Kani
2015-03-24 22:43 ` [PATCH v4 0/7] mtrr, mm, x86: Enhance MTRR checks for huge I/O mapping Andrew Morton
2015-03-24 22:43   ` Andrew Morton
2015-04-03  6:33   ` Ingo Molnar
2015-04-03  6:33     ` Ingo Molnar
2015-04-03 15:22     ` Toshi Kani
2015-04-03 15:22       ` Toshi Kani
2015-04-27 14:31       ` Toshi Kani
2015-04-27 14:31         ` Toshi Kani
2015-03-20 23:17 [PATCH v1 00/47] mtrr/x86/drivers: bury MTRR Luis R. Rodriguez
2015-03-20 23:17 ` Luis R. Rodriguez
2015-03-20 23:17 ` [PATCH v1 01/47] x86: mtrr: annotate mtrr_type_lookup() is only implemented on generic_mtrr_ops Luis R. Rodriguez
2015-03-20 23:17   ` Luis R. Rodriguez
2015-03-20 23:17 ` [PATCH v1 02/47] x86: mtrr: generalize run time disabling of MTRR Luis R. Rodriguez
2015-03-20 23:17   ` Luis R. Rodriguez
2015-03-25 19:59   ` Konrad Rzeszutek Wilk
2015-03-25 19:59     ` Konrad Rzeszutek Wilk
2015-03-26  4:38     ` Juergen Gross
2015-03-26  4:38       ` Juergen Gross
2015-03-26 23:35     ` Luis R. Rodriguez
2015-03-26 23:35       ` Luis R. Rodriguez
2015-04-02 20:13       ` Bjorn Helgaas
2015-04-02 20:13         ` Bjorn Helgaas
2015-04-02 20:13         ` Bjorn Helgaas
2015-04-02 20:20         ` Luis R. Rodriguez
2015-04-02 20:20           ` Luis R. Rodriguez
2015-04-02 20:20           ` Luis R. Rodriguez
2015-04-02 20:28           ` Bjorn Helgaas
2015-04-02 20:28             ` Bjorn Helgaas
2015-04-02 20:28             ` Bjorn Helgaas
2015-04-02 21:02             ` Luis R. Rodriguez
2015-04-02 21:02               ` Luis R. Rodriguez
2015-04-02 21:02               ` Luis R. Rodriguez
2015-04-02 22:09               ` Bjorn Helgaas
2015-04-02 22:09                 ` Bjorn Helgaas
2015-04-02 22:09                 ` Bjorn Helgaas
2015-04-02 22:12                 ` [Xen-devel] " Luis R. Rodriguez
2015-04-02 22:12                   ` Luis R. Rodriguez
2015-04-02 22:12                   ` Luis R. Rodriguez
2015-03-27 20:40   ` Toshi Kani
2015-03-27 20:40     ` Toshi Kani
2015-03-27 23:56     ` Luis R. Rodriguez
2015-03-27 23:56       ` Luis R. Rodriguez
2015-04-02 21:49       ` Luis R. Rodriguez
2015-04-02 21:49         ` Luis R. Rodriguez
2015-04-02 23:52         ` Toshi Kani
2015-04-02 23:52           ` Toshi Kani
2015-04-03  1:08           ` Luis R. Rodriguez
2015-04-03  1:08             ` Luis R. Rodriguez
2015-03-20 23:17 ` [PATCH v1 03/47] devres: add devm_ioremap_wc() Luis R. Rodriguez
2015-03-20 23:17 ` Luis R. Rodriguez
2015-03-20 23:17   ` Luis R. Rodriguez
2015-03-20 23:49   ` Andy Lutomirski
2015-03-20 23:49     ` Andy Lutomirski
2015-03-25 19:50     ` Luis R. Rodriguez
2015-03-25 19:50       ` Luis R. Rodriguez
2015-03-25 19:50     ` Luis R. Rodriguez
2015-03-20 23:49   ` Andy Lutomirski
2015-03-20 23:17 ` [PATCH v1 04/47] pci: add pci_ioremap_wc_bar() Luis R. Rodriguez
2015-03-20 23:17   ` Luis R. Rodriguez
2015-03-20 23:50   ` Andy Lutomirski
2015-03-20 23:50   ` Andy Lutomirski
2015-03-20 23:50     ` Andy Lutomirski
2015-03-25 20:06     ` Luis R. Rodriguez
2015-03-25 20:06     ` Luis R. Rodriguez
2015-03-25 20:06       ` Luis R. Rodriguez
2015-03-25 20:03   ` Konrad Rzeszutek Wilk
2015-03-25 20:03   ` [Xen-devel] " Konrad Rzeszutek Wilk
2015-03-25 20:03     ` Konrad Rzeszutek Wilk
2015-03-25 20:39     ` Luis R. Rodriguez
2015-03-25 20:39       ` Luis R. Rodriguez
2015-03-25 20:39     ` Luis R. Rodriguez
2015-03-20 23:17 ` Luis R. Rodriguez
2015-03-20 23:17 ` [PATCH v1 05/47] pci: add pci_iomap_wc() variants Luis R. Rodriguez
2015-03-20 23:17   ` Luis R. Rodriguez
2015-03-23 17:20   ` Bjorn Helgaas
2015-03-23 17:20     ` Bjorn Helgaas
2015-03-23 17:20     ` Bjorn Helgaas
2015-03-26  3:00     ` Luis R. Rodriguez
2015-03-26  3:00     ` Luis R. Rodriguez
2015-03-26  3:00       ` Luis R. Rodriguez
2015-04-21 17:52       ` Luis R. Rodriguez
2015-04-21 18:46         ` Michael S. Tsirkin
2015-04-21 18:46         ` Michael S. Tsirkin
2015-04-21 17:52       ` Luis R. Rodriguez
2015-03-27 19:18     ` Toshi Kani
2015-03-27 19:18       ` Toshi Kani
2015-03-27 19:18       ` Toshi Kani
2015-04-21 19:25     ` Michael S. Tsirkin
2015-04-21 19:25       ` Michael S. Tsirkin
2015-04-21 19:25       ` Michael S. Tsirkin
2015-04-21 19:27       ` Luis R. Rodriguez
2015-04-21 19:27         ` Luis R. Rodriguez
2015-04-21 19:27         ` Luis R. Rodriguez
2015-03-25 20:07   ` Konrad Rzeszutek Wilk
2015-03-25 20:07     ` Konrad Rzeszutek Wilk
2015-03-25 20:07     ` Konrad Rzeszutek Wilk
2015-03-27 18:40     ` Luis R. Rodriguez
2015-03-27 18:40       ` Luis R. Rodriguez
2015-03-27 18:40       ` Luis R. Rodriguez
2015-03-20 23:17 ` [PATCH v1 06/47] mtrr: add __arch_phys_wc_add() Luis R. Rodriguez
2015-03-20 23:17   ` Luis R. Rodriguez
2015-03-20 23:48   ` Andy Lutomirski
2015-03-20 23:48   ` Andy Lutomirski
2015-03-20 23:48     ` Andy Lutomirski
2015-03-27 19:53     ` Luis R. Rodriguez
2015-03-27 19:53     ` Luis R. Rodriguez
2015-03-27 19:53       ` Luis R. Rodriguez
2015-03-27 19:58       ` Andy Lutomirski
2015-03-27 19:58       ` Andy Lutomirski
2015-03-27 19:58         ` Andy Lutomirski
2015-03-27 20:30         ` Luis R. Rodriguez
2015-03-27 20:30         ` Luis R. Rodriguez
2015-03-27 20:30           ` Luis R. Rodriguez
2015-03-27 21:23           ` Andy Lutomirski
2015-03-27 21:23             ` Andy Lutomirski
2015-03-27 23:04             ` Luis R. Rodriguez
2015-03-27 23:04             ` Luis R. Rodriguez
2015-03-27 23:04               ` Luis R. Rodriguez
2015-03-27 23:10               ` Andy Lutomirski
2015-03-27 23:10                 ` Andy Lutomirski
2015-03-27 23:33                 ` Luis R. Rodriguez
2015-03-27 23:33                   ` Luis R. Rodriguez
2015-03-27 23:33                 ` Luis R. Rodriguez
2015-03-27 23:10               ` Andy Lutomirski
2015-03-27 21:23           ` Andy Lutomirski
2015-04-02 20:21   ` Bjorn Helgaas
2015-04-02 20:21     ` Bjorn Helgaas
2015-04-02 20:55     ` Luis R. Rodriguez
2015-04-02 20:55       ` Luis R. Rodriguez
2015-04-02 22:35       ` Bjorn Helgaas
2015-04-02 22:35         ` Bjorn Helgaas
2015-04-02 22:54         ` Luis R. Rodriguez
2015-04-02 22:54           ` Luis R. Rodriguez
2015-04-02 22:54         ` Luis R. Rodriguez
2015-04-02 22:35       ` Bjorn Helgaas
2015-04-02 20:55     ` Luis R. Rodriguez
2015-04-02 20:21   ` Bjorn Helgaas
2015-03-20 23:17 ` Luis R. Rodriguez
2015-03-20 23:17 ` [PATCH v1 07/47] video: fbdev: atyfb: move framebuffer length fudging to helper Luis R. Rodriguez
2015-03-20 23:17   ` Luis R. Rodriguez
2015-03-20 23:17 ` Luis R. Rodriguez
2015-03-20 23:17 ` [PATCH v1 08/47] video: fbdev: atyfb: clarify ioremap() base and length used Luis R. Rodriguez
2015-03-20 23:17   ` Luis R. Rodriguez
2015-03-20 23:17 ` Luis R. Rodriguez
2015-03-20 23:17 ` [PATCH v1 09/47] vidoe: fbdev: atyfb: remove and fix MTRR MMIO "hole" work around Luis R. Rodriguez
2015-03-20 23:17   ` Luis R. Rodriguez
2015-03-20 23:52   ` Andy Lutomirski
2015-03-20 23:52     ` Andy Lutomirski
2015-03-27 20:12     ` Luis R. Rodriguez
2015-03-27 20:12     ` Luis R. Rodriguez
2015-03-27 20:12       ` Luis R. Rodriguez
2015-03-27 21:21       ` Andy Lutomirski
2015-03-27 21:21       ` Andy Lutomirski
2015-03-27 21:21         ` Andy Lutomirski
2015-03-27 23:31         ` Luis R. Rodriguez
2015-03-27 23:31           ` Luis R. Rodriguez
2015-03-27 23:31         ` Luis R. Rodriguez
2015-03-20 23:52   ` Andy Lutomirski
2015-03-21  9:15   ` Ville Syrjälä
2015-03-21  9:15   ` Ville Syrjälä
2015-03-21  9:15     ` Ville Syrjälä
2015-03-27  8:37     ` Ville Syrjälä
2015-03-27  8:37     ` Ville Syrjälä
2015-03-27  8:37       ` Ville Syrjälä
2015-03-27 19:38       ` Luis R. Rodriguez
2015-03-27 19:38         ` Luis R. Rodriguez
2015-03-27 19:38       ` Luis R. Rodriguez
2015-03-27 19:38     ` Luis R. Rodriguez
2015-03-27 19:38     ` Luis R. Rodriguez
2015-03-27 19:38       ` Luis R. Rodriguez
2015-03-27 19:43       ` Andy Lutomirski
2015-03-27 19:43       ` Andy Lutomirski
2015-03-27 19:43         ` Andy Lutomirski
2015-03-27 19:57         ` Luis R. Rodriguez
2015-03-27 19:57         ` Luis R. Rodriguez
2015-03-27 19:57           ` Luis R. Rodriguez
2015-03-27 21:56           ` Ville Syrjälä
2015-03-27 21:56             ` Ville Syrjälä
2015-03-27 22:02             ` Andy Lutomirski
2015-03-27 22:02             ` Andy Lutomirski
2015-03-27 22:02               ` Andy Lutomirski
2015-03-28  0:28               ` Luis R. Rodriguez
2015-03-28  0:28               ` Luis R. Rodriguez
2015-03-28  0:28                 ` Luis R. Rodriguez
2015-03-28 12:23                 ` Ville Syrjälä
2015-03-28 12:23                   ` Ville Syrjälä
2015-04-01 23:52                   ` Luis R. Rodriguez
2015-04-01 23:52                   ` Luis R. Rodriguez
2015-04-01 23:52                     ` Luis R. Rodriguez
2015-04-02  0:04                     ` Andy Lutomirski
2015-04-02  0:04                     ` Andy Lutomirski
2015-04-02  0:04                       ` Andy Lutomirski
2015-04-02 19:45                       ` Luis R. Rodriguez
2015-04-02 19:45                         ` Luis R. Rodriguez
2015-04-02 19:50                         ` Andy Lutomirski
2015-04-02 19:50                         ` Andy Lutomirski
2015-04-02 19:50                           ` Andy Lutomirski
2015-04-02 19:45                       ` Luis R. Rodriguez
2015-03-28 12:23                 ` Ville Syrjälä
2015-03-28  0:21             ` Luis R. Rodriguez
2015-03-28  0:21             ` Luis R. Rodriguez
2015-03-28  0:21               ` Luis R. Rodriguez
2015-03-27 21:56           ` Ville Syrjälä
2015-03-20 23:17 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 10/47] video: fbdev: atyfb: use arch_phys_wc_add() and ioremap_wc() Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 11/47] IB/qib: add acounting for MTRR Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 12/47] IB/qib: use arch_phys_wc_add() Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 13/47] IB/ipath: add counting for MTRR Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 14/47] IB/ipath: use __arch_phys_wc_add() Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 15/47] [media] media: ivtv: " Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 16/47] fusion: " Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 17/47] video: fbdev: vesafb: only support MTRR_TYPE_WRCOMB Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 18/47] vidoe: fbdev: vesafb: add missing mtrr_del() for added MTRR Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 19/47] video: fbdev: vesafb: use arch_phys_wc_add() Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 20/47] mtrr: avoid ifdef'ery with phys_wc_to_mtrr_index() Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 21/47] ethernet: myri10ge: use arch_phys_wc_add() Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-21  7:08   ` Hyong-Youb Kim
2015-03-21  7:08   ` Hyong-Youb Kim
2015-03-21  7:08     ` Hyong-Youb Kim
2015-03-27 20:36     ` Luis R. Rodriguez
2015-03-27 20:36     ` Luis R. Rodriguez
2015-03-27 20:36       ` Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 22/47] staging: sm750fb: use arch_phys_wc_add() and ioremap_wc() Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 23/47] staging: xgifb: " Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-04-30 17:40   ` Luis R. Rodriguez
2015-04-30 17:40   ` Luis R. Rodriguez
2015-04-30 17:40     ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 24/47] video: fbdev: arkfb: use arch_phys_wc_add() and pci_iomap_wc() Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 25/47] video: fbdev: radeonfb: use arch_phys_wc_add() and ioremap_wc() Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 26/47] video: fbdev: gbefb: add missing mtrr_del() calls Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 27/47] video: fbdev: gbefb: use arch_phys_wc_add() and devm_ioremap_wc() Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 28/47] video: fbdev: intelfb: use arch_phys_wc_add() and ioremap_wc() Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 29/47] video: fbdev: matrox: " Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 30/47] video: fbdev: neofb: " Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 31/47] video: fbdev: s3fb: use arch_phys_wc_add() and pci_iomap_wc() Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 32/47] video: fbdev: nvidia: use arch_phys_wc_add() and ioremap_wc() Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 33/47] video: fbdev: savagefb: " Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 34/47] video: fbdev: sisfb: " Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 35/47] video: fbdev: aty: " Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 36/47] video: fbdev: i810: " Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 37/47] video: fbdev: i740fb: use arch_phys_wc_add() and pci_ioremap_wc_bar() Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 38/47] video: fbdev: kyrofb: " Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 39/47] video: fbdev: pm2fb: use arch_phys_wc_add() and ioremap_wc() Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 40/47] video: fbdev: pm3fb: " Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 41/47] video: fbdev: rivafb: " Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 42/47] video: fbdev: tdfxfb: " Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 43/47] video: fbdev: vt8623fb: use arch_phys_wc_add() and pci_iomap_wc() Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 44/47] video: fbdev: atmel_lcdfb: use ioremap_wc() for framebuffer Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 45/47] video: fbdev: geode gxfb: " Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 46/47] video: fbdev: gxt4500: use pci_ioremap_wc_bar() " Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18 ` [PATCH v1 47/47] mtrr: bury MTRR - unexport mtrr_add() and mtrr_del() Luis R. Rodriguez
2015-03-20 23:18 ` Luis R. Rodriguez
2015-03-20 23:18   ` Luis R. Rodriguez
2015-03-21  1:08 ` [PATCH v1 00/47] mtrr/x86/drivers: bury MTRR Andy Lutomirski
2015-03-21  1:08 ` Andy Lutomirski
2015-03-21  1:08   ` Andy Lutomirski

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=ddfb7036fec3005609e7f791528644d2c98b156b.1431966710.git.jpoimboe@redhat.com \
    --to=jpoimboe@redhat.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=live-patching@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=mmarek@suse.cz \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=x86@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.