build/patch/kernel/sun8i-default/linux-82-fix-build-on-non-amd64-hosts.patch

125 lines
3.3 KiB
Diff

diff -Nur a/arch/arm/mach-sunxi/power/brom/Makefile b/arch/arm/mach-sunxi/power/brom/Makefile
--- a/arch/arm/mach-sunxi/power/brom/Makefile 2016-03-07 23:43:50.629142681 +0100
+++ b/arch/arm/mach-sunxi/power/brom/Makefile 2016-03-07 23:52:43.092375154 +0100
@@ -3,6 +3,8 @@
always := resumes.code
targets := resumes.elf
+hostprogs-y := mksunxichecksum
+
#use "-Os" flags.
#Don't use "-O2" flags.
KBUILD_CFLAGS := -g -c -nostdlib -march=armv7-a -marm -fno-unwind-tables -fno-asynchronous-unwind-tables -mlittle-endian -O2
@@ -22,8 +24,8 @@
resumes-y := $(addprefix $(obj)/,$(resumes-y))
-$(obj)/resumes.code: $(src)/gen_check_code $(obj)/resumes.bin
- $(Q)$< $(obj)/resumes.bin $(obj)/resumes.code
+$(obj)/resumes.code: $(obj)/resumes.bin $(obj)/mksunxichecksum
+ $(obj)/mksunxichecksum $(obj)/resumes.bin $(obj)/resumes.code
$(obj)/resumes.bin: $(obj)/resumes.elf FORCE
$(Q)$(CROSS_COMPILE)objcopy -O binary $(obj)/resumes.elf $(obj)/resumes.bin
diff -Nur a/arch/arm/mach-sunxi/power/brom/mksunxichecksum.c b/arch/arm/mach-sunxi/power/brom/mksunxichecksum.c
--- a/arch/arm/mach-sunxi/power/brom/mksunxichecksum.c 1970-01-01 01:00:00.000000000 +0100
+++ b/arch/arm/mach-sunxi/power/brom/mksunxichecksum.c 2016-01-05 19:45:42.000000000 +0100
@@ -0,0 +1,98 @@
+/*
+ * (C) Copyright 2015 Jean-Francois Moine
+ * (C) Copyright 2014 Henrik Nordstrom
+ *
+ * Based on mksunxiboot
+ *
+ * (C) Copyright 2007-2011
+ * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+/* boot head definition from sun4i boot code */
+struct boot_file_head {
+ uint32_t b_instruction; /* one intruction jumping to real code */
+ uint8_t magic[8]; /* ="eGON.BT0" or "eGON.BT1", not C-style str */
+ uint32_t check_sum; /* generated by PC */
+ uint32_t length; /* generated by PC */
+ /*
+ * We use a simplified header, only filling in what is needed
+ * for checksum calculation.
+ */
+};
+
+#define STAMP_VALUE 0x5F0A6C39
+
+/* check sum functon from sun4i boot code */
+static int gen_check_sum(struct boot_file_head *head_p)
+{
+ uint32_t length;
+ uint32_t *buf;
+ uint32_t loop;
+ uint32_t i;
+ uint32_t sum;
+
+ length = head_p->length;
+// if ((length & 0x3) != 0) /* must 4-byte-aligned */
+// return -1;
+ buf = (uint32_t *)head_p;
+ head_p->check_sum = STAMP_VALUE; /* fill stamp */
+ loop = length >> 2;
+
+ /* calculate the sum */
+ for (i = 0, sum = 0; i < loop; i++)
+ sum += buf[i];
+
+ /* write back check sum */
+ head_p->check_sum = sum;
+
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ struct boot_file_head h, *buf;
+ unsigned file_size;
+ FILE *f;
+
+ if (argc != 3) {
+ printf("Usage: %s file.bin file.code\n"
+ "calculates BROM checksum in boot header of given .bin file and writes to .code file\n"
+ "", argv[0]);
+ exit(1);
+ }
+
+ f = fopen(argv[1], "rb");
+ if (!f) {
+ perror("Open input file");
+ exit(1);
+ }
+
+ fread(&h, 1, sizeof h, f);
+ file_size = h.length; // wanted length
+
+ buf = malloc(file_size);
+ memset(buf, 0xff, file_size);
+ rewind(f);
+
+ fread(buf, 1, file_size, f);
+ fclose(f);
+
+ gen_check_sum(buf);
+
+ f = fopen(argv[2], "wb");
+ if (!f) {
+ perror("Open output file");
+ exit(1);
+ }
+ fwrite(buf, 1, file_size, f);
+ fclose(f);
+
+ return 0;
+}