summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Serbinenko <phcoder@gmail.com>2016-02-19 16:44:22 +0100
committerVladimir Serbinenko <phcoder@gmail.com>2016-02-22 18:38:48 +0100
commitf0d39c409b95c2095f84adcd0dcb9b0381e1562e (patch)
tree4fdf1283e71c03a6c747ab87e6d874c9010d6ba1
parent4f22267b09565055f297808adc3c260c749332fb (diff)
downloadcoreboot-f0d39c409b95c2095f84adcd0dcb9b0381e1562e.tar.xz
die() when attempting to use bounce buffer on non-i386.
Only i386 has code to support bounce buffer. For others coreboot would silently discard part of binary which doesn't work and is a hell to debug. Instead just die. Change-Id: I37ae24ea5d13aae95f9856a896700a0408747233 Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com> Reviewed-on: https://review.coreboot.org/13750 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin <adurbin@chromium.org>
-rw-r--r--src/arch/arm/boot.c5
-rw-r--r--src/arch/arm64/boot.c5
-rw-r--r--src/arch/mips/boot.c5
-rw-r--r--src/arch/power8/boot.c5
-rw-r--r--src/arch/riscv/boot.c5
-rw-r--r--src/arch/x86/boot.c5
-rw-r--r--src/include/program_loading.h3
-rw-r--r--src/lib/selfboot.c3
8 files changed, 36 insertions, 0 deletions
diff --git a/src/arch/arm/boot.c b/src/arch/arm/boot.c
index 1767fe04c2..e208fc9051 100644
--- a/src/arch/arm/boot.c
+++ b/src/arch/arm/boot.c
@@ -25,3 +25,8 @@ void arch_prog_run(struct prog *prog)
doit = prog_entry(prog);
doit(prog_entry_arg(prog));
}
+
+int arch_supports_bounce_buffer(void)
+{
+ return 0;
+}
diff --git a/src/arch/arm64/boot.c b/src/arch/arm64/boot.c
index fa83c3f657..d498cd9362 100644
--- a/src/arch/arm64/boot.c
+++ b/src/arch/arm64/boot.c
@@ -72,6 +72,11 @@ void arch_prog_run(struct prog *prog)
doit(prog_entry_arg(prog));
}
+int arch_supports_bounce_buffer(void)
+{
+ return 0;
+}
+
/* Generic stage entry point. Can be overridden by board/SoC if needed. */
__attribute__((weak)) void stage_entry(void)
{
diff --git a/src/arch/mips/boot.c b/src/arch/mips/boot.c
index 5ab36ec390..608af7b588 100644
--- a/src/arch/mips/boot.c
+++ b/src/arch/mips/boot.c
@@ -23,3 +23,8 @@ void arch_prog_run(struct prog *prog)
doit(cb_tables);
}
+
+int arch_supports_bounce_buffer(void)
+{
+ return 0;
+}
diff --git a/src/arch/power8/boot.c b/src/arch/power8/boot.c
index 4da60b4e6c..fa1586f25b 100644
--- a/src/arch/power8/boot.c
+++ b/src/arch/power8/boot.c
@@ -21,3 +21,8 @@ void arch_prog_run(struct prog *prog)
doit(prog_entry_arg(prog));
}
+
+int arch_supports_bounce_buffer(void)
+{
+ return 0;
+}
diff --git a/src/arch/riscv/boot.c b/src/arch/riscv/boot.c
index 552b3f4cd6..96526bf64b 100644
--- a/src/arch/riscv/boot.c
+++ b/src/arch/riscv/boot.c
@@ -30,3 +30,8 @@ void arch_prog_run(struct prog *prog)
doit(prog_entry_arg(prog));
}
}
+
+int arch_supports_bounce_buffer(void)
+{
+ return 0;
+}
diff --git a/src/arch/x86/boot.c b/src/arch/x86/boot.c
index b23e322d6c..ba78c4e308 100644
--- a/src/arch/x86/boot.c
+++ b/src/arch/x86/boot.c
@@ -192,6 +192,11 @@ static void jmp_payload(void *entry, unsigned long buffer, unsigned long size)
);
}
+int arch_supports_bounce_buffer(void)
+{
+ return 1;
+}
+
static void try_payload(struct prog *prog)
{
if (prog_type(prog) == PROG_PAYLOAD) {
diff --git a/src/include/program_loading.h b/src/include/program_loading.h
index f71dcb79e5..8ac73ddf8a 100644
--- a/src/include/program_loading.h
+++ b/src/include/program_loading.h
@@ -41,6 +41,9 @@ enum prog_type {
* set on the last segment loaded. */
void arch_segment_loaded(uintptr_t start, size_t size, int flags);
+/* Return true if arch supports bounce buffer. */
+int arch_supports_bounce_buffer(void);
+
/* Representation of a program. */
struct prog {
/* The region_device is the source of program content to load. After
diff --git a/src/lib/selfboot.c b/src/lib/selfboot.c
index 6d86159ddd..f3a1e52728 100644
--- a/src/lib/selfboot.c
+++ b/src/lib/selfboot.c
@@ -114,6 +114,9 @@ static int relocate_segment(unsigned long buffer, struct segment *seg)
if (!overlaps_coreboot(seg))
return 0;
+ if (!arch_supports_bounce_buffer())
+ die ("bounce buffer not supported");
+
start = seg->s_dstaddr;
middle = start + seg->s_filesz;
end = start + seg->s_memsz;