From ad67f283973d79f7d93e84a847ad2e7588408129 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Pali=20Roh=C3=A1r?= Date: Mon, 9 Jul 2012 11:50:56 +0200 Subject: [PATCH] Enable thumb support, add thumb patches from cssu-kernel --- kernel-power-2.6.28/debian/control | 3 +- ...ate_when_invoking_a_thumb_2_signal_handler.diff | 38 +++++ .../debian/patches/rx51_add_secure_ppa_api.diff | 165 ++++++++++++++++++++ .../debian/patches/rx51_arm_errata_430973.diff | 84 ++++++++++ kernel-power-2.6.28/debian/patches/series | 3 + 5 files changed, 292 insertions(+), 1 deletion(-) create mode 100644 kernel-power-2.6.28/debian/patches/clear_the_it_state_when_invoking_a_thumb_2_signal_handler.diff create mode 100644 kernel-power-2.6.28/debian/patches/rx51_add_secure_ppa_api.diff create mode 100644 kernel-power-2.6.28/debian/patches/rx51_arm_errata_430973.diff diff --git a/kernel-power-2.6.28/debian/control b/kernel-power-2.6.28/debian/control index 5278d1d..55f949c 100644 --- a/kernel-power-2.6.28/debian/control +++ b/kernel-power-2.6.28/debian/control @@ -27,7 +27,8 @@ Provides: kernel-feature-netfilter, kernel-feature-ipv6, kernel-feature-ext4, ke kernel-feature-usbip, kernel-feature-ppp, kernel-feature-qos, kernel-feature-block2mtd, kernel-feature-kexec, kernel-feature-overclock, kernel-feature-joikuspot, kernel-feature-slip, kernel-feature-battery, kernel-feature-pptp, kernel-feature-wlan-monitor, kernel-feature-radiords, kernel-feature-ioacct, kernel-feature-usbhost, kernel-feature-framebuffer, - kernel-feature-smartreflex, kernel-feature-video720p, kernel-feature-packet-injection, kernel-feature-charger + kernel-feature-smartreflex, kernel-feature-video720p, kernel-feature-packet-injection, kernel-feature-charger, + kernel-feature-errata-430973-workaround XB-Maemo-Display-Name: Linux kernel for power user (boot image for multiboot) Description: Linux kernel boot image (kernel power 2.6.28.10) This package provides a bootable kernel image and config files diff --git a/kernel-power-2.6.28/debian/patches/clear_the_it_state_when_invoking_a_thumb_2_signal_handler.diff b/kernel-power-2.6.28/debian/patches/clear_the_it_state_when_invoking_a_thumb_2_signal_handler.diff new file mode 100644 index 0000000..3257d9f --- /dev/null +++ b/kernel-power-2.6.28/debian/patches/clear_the_it_state_when_invoking_a_thumb_2_signal_handler.diff @@ -0,0 +1,38 @@ +Index: kernel-cssu-2.6.28/arch/arm/include/asm/ptrace.h +=================================================================== +--- kernel-cssu-2.6.28.orig/arch/arm/include/asm/ptrace.h 2012-06-18 17:42:46.279853899 -0400 ++++ kernel-cssu-2.6.28/arch/arm/include/asm/ptrace.h 2012-06-18 17:45:47.075328476 -0400 +@@ -65,6 +65,13 @@ + #define PSR_x 0x0000ff00 /* Extension */ + #define PSR_c 0x000000ff /* Control */ + ++/* ++ * ARMv7 groups of APSR bits ++ */ ++#define PSR_ISET_MASK 0x01000010 /* ISA state (J, T) mask */ ++#define PSR_IT_MASK 0x0600fc00 /* If-Then execution state mask */ ++#define PSR_ENDIAN_MASK 0x00000200 /* Endianness state mask */ ++ + #ifndef __ASSEMBLY__ + + /* +Index: kernel-cssu-2.6.28/arch/arm/kernel/signal.c +=================================================================== +--- kernel-cssu-2.6.28.orig/arch/arm/kernel/signal.c 2012-06-18 17:43:06.354996651 -0400 ++++ kernel-cssu-2.6.28/arch/arm/kernel/signal.c 2012-06-18 17:48:41.731936840 -0400 +@@ -487,9 +487,13 @@ + */ + thumb = handler & 1; + +- if (thumb) ++ if (thumb) { + cpsr |= PSR_T_BIT; +- else ++#if __LINUX_ARM_ARCH__ >= 7 ++ /* clear the If-Then Thumb-2 execution state */ ++ cpsr &= ~PSR_IT_MASK; ++#endif ++ } else + cpsr &= ~PSR_T_BIT; + } + #endif diff --git a/kernel-power-2.6.28/debian/patches/rx51_add_secure_ppa_api.diff b/kernel-power-2.6.28/debian/patches/rx51_add_secure_ppa_api.diff new file mode 100644 index 0000000..477f479 --- /dev/null +++ b/kernel-power-2.6.28/debian/patches/rx51_add_secure_ppa_api.diff @@ -0,0 +1,165 @@ +Index: kernel-cssu-2.6.28/arch/arm/mach-omap2/Makefile +=================================================================== +--- kernel-cssu-2.6.28.orig/arch/arm/mach-omap2/Makefile 2012-05-25 02:00:58.981062096 -0400 ++++ kernel-cssu-2.6.28/arch/arm/mach-omap2/Makefile 2012-05-25 01:58:35.689019000 -0400 +@@ -100,7 +100,9 @@ + board-rx51-peripherals.o \ + mmc-twl4030.o \ + ssi.o \ +- usb-musb.o ++ usb-musb.o \ ++ board-rx51-smc.o board-rx51-secure.o ++ + obj-$(CONFIG_MACH_NOKIA_RX71) += board-rx71.o \ + board-rx71-peripherals.o + +Index: kernel-cssu-2.6.28/arch/arm/mach-omap2/board-rx51-secure.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ kernel-cssu-2.6.28/arch/arm/mach-omap2/board-rx51-secure.c 2012-05-25 01:58:35.689019000 -0400 +@@ -0,0 +1,66 @@ ++/* ++ * RX51 Secure PPA API. ++ * ++ * Copyright (C) 2012 Ivaylo Dimitrov ++ * ++ * ++ * This program is free software,you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++#include ++ ++#include "board-rx51-secure.h" ++ ++/** ++ * rx51_secure_dispatcher: Routine to dispatch secure PPA API calls ++ * @idx: The PPA API index ++ * @flag: The flag indicating criticality of operation ++ * @nargs: Number of valid arguments out of four. ++ * @arg1, arg2, arg3 args4: Parameters passed to secure API ++ * ++ * Return the non-zero error value on failure. ++ */ ++u32 rx51_secure_dispatcher(u32 idx, u32 flag, u32 nargs, u32 arg1, u32 arg2, ++ u32 arg3, u32 arg4) ++{ ++ u32 ret; ++ u32 param[5]; ++ ++ param[0] = nargs+1; ++ param[1] = arg1; ++ param[2] = arg2; ++ param[3] = arg3; ++ param[4] = arg4; ++ ++ /* ++ * Secure API needs physical address ++ * pointer for the parameters ++ */ ++ flush_cache_all(); ++ outer_clean_range(__pa(param), __pa(param + 5)); ++ ret = rx51_ppa_smc(idx, flag, __pa(param)); ++ ++ return ret; ++} ++ ++/** ++ * rx51_secure_update_aux_cr: Routine to modify the contents of Auxiliary Control Register ++ * @set_bits: bits to set in ACR ++ * @clr_bits: bits to clear in ACR ++ * ++ * Return the non-zero error value on failure. ++*/ ++u32 rx51_secure_update_aux_cr(u32 set_bits, u32 clear_bits) ++{ ++ u32 acr; ++ ++ /* Read ACR */ ++ asm volatile ("mrc p15, 0, %0, c1, c0, 1" : "=r" (acr)); ++ acr &= ~clear_bits; ++ acr |= set_bits; ++ ++ return rx51_secure_dispatcher(RX51_PPA_WRITE_ACR, ++ FLAG_START_CRITICAL, ++ 1,acr,0,0,0); ++} +Index: kernel-cssu-2.6.28/arch/arm/mach-omap2/board-rx51-secure.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ kernel-cssu-2.6.28/arch/arm/mach-omap2/board-rx51-secure.h 2012-05-25 01:58:35.689019000 -0400 +@@ -0,0 +1,36 @@ ++/* ++ * board-rx51-secure.h: OMAP Secure infrastructure header. ++ * ++ * Copyright (C) 2012 Ivaylo Dimitrov ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++#ifndef OMAP_RX51_SECURE_H ++#define OMAP_RX51_SECURE_H ++ ++/* HAL API error codes */ ++#define API_HAL_RET_VALUE_OK 0x00 ++#define API_HAL_RET_VALUE_FAIL 0x01 ++ ++/* Secure HAL API flags */ ++#define FLAG_START_CRITICAL 0x4 ++#define FLAG_IRQFIQ_MASK 0x3 ++#define FLAG_IRQ_ENABLE 0x2 ++#define FLAG_FIQ_ENABLE 0x1 ++#define NO_FLAG 0x0 ++ ++/* Secure PPA(Primary Protected Application) APIs */ ++#define RX51_PPA_L2_INVAL 40 ++#define RX51_PPA_WRITE_ACR 42 ++ ++#ifndef __ASSEMBLER__ ++ ++extern u32 rx51_secure_dispatcher(u32 idx, u32 flag, u32 nargs, ++ u32 arg1, u32 arg2, u32 arg3, u32 arg4); ++extern u32 rx51_ppa_smc(u32 id, u32 flag, u32 pargs); ++ ++extern u32 rx51_secure_update_aux_cr(u32 set_bits, u32 clear_bits); ++#endif /* __ASSEMBLER__ */ ++#endif /* OMAP_RX51_SECURE_H */ +Index: kernel-cssu-2.6.28/arch/arm/mach-omap2/board-rx51-smc.S +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ kernel-cssu-2.6.28/arch/arm/mach-omap2/board-rx51-smc.S 2012-05-25 02:09:15.244206814 -0400 +@@ -0,0 +1,33 @@ ++/* ++ * RX51 secure APIs file. ++ * ++ * Copyright (C) 2012 Ivaylo Dimitrov ++ * ++ * ++ * This program is free software,you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include ++ ++/** ++ * u32 rx51_ppa_smc(u32 id, u32 flag, u32 pargs) ++ * Low level common routine for secure HAL and PPA APIs. ++ * @id: Secure Service ID ++ * @flag: Flag to indicate the criticality of operation ++ * @pargs: Physical address of parameter list starting ++ * with number of parametrs ++ */ ++ENTRY(rx51_ppa_smc) ++ stmfd sp!, {r4-r12, lr} ++ mov r12, r0 @ Copy the secure service ID ++ mov r3, r2 @ Copy the pointer to va_list in R3 ++ mov r2, r1 @ Copy the flags in R2 ++ mov r1, #0x0 @ Process ID - 0 ++ mov r6, #0xff @ Indicate new Task call ++ dsb ++ dmb ++ .word 0xe1600071 @ SMC #1 to call PPA service - hand assembled ++ ldmfd sp!, {r4-r12, pc} ++ENDPROC(rx51_ppa_smc) diff --git a/kernel-power-2.6.28/debian/patches/rx51_arm_errata_430973.diff b/kernel-power-2.6.28/debian/patches/rx51_arm_errata_430973.diff new file mode 100644 index 0000000..ad68f22 --- /dev/null +++ b/kernel-power-2.6.28/debian/patches/rx51_arm_errata_430973.diff @@ -0,0 +1,84 @@ +Index: kernel-cssu-2.6.28/arch/arm/mach-omap2/board-rx51.c +=================================================================== +--- kernel-cssu-2.6.28.orig/arch/arm/mach-omap2/board-rx51.c 2012-05-25 04:12:52.708683352 -0400 ++++ kernel-cssu-2.6.28/arch/arm/mach-omap2/board-rx51.c 2012-05-25 03:52:23.617140000 -0400 +@@ -45,6 +45,8 @@ + #include + #include "cm.h" + ++#include "board-rx51-secure.h" ++ + #define RX51_USB_TRANSCEIVER_RST_GPIO 67 + + extern int omap_init_fb(void); +@@ -162,6 +164,56 @@ + .set_pm_limits = rx51_usb_set_pm_limits, + }; + ++#ifdef CONFIG_ARM_ERRATA_430973 ++static ssize_t rx51_errata_430973_show(struct kobject *kobj, ++ struct kobj_attribute *attr, ++ char *buf) ++{ ++ u32 acr; ++ ++ /* Read ACR */ ++ asm volatile ("mrc p15, 0, %0, c1, c0, 1" : "=r" (acr)); ++ ++ return sprintf(buf,"%u\n",(acr >> 6) & 1); ++} ++ ++static ssize_t rx51_errata_430973_store(struct kobject *kobj, ++ struct kobj_attribute *attr, ++ const char *buf, size_t n) ++{ ++ u32 value; ++ ++ if (sscanf(buf, "%u", &value) != 1) ++ { ++ printk(KERN_ERR "errata_430973: Invalid value\n"); ++ return -EINVAL; ++ } ++ if(value) ++ rx51_secure_update_aux_cr(1 << 6, 0); ++ else ++ rx51_secure_update_aux_cr(0, 1 << 6); ++ ++ return n; ++} ++ ++static struct kobj_attribute rx51_errata_430973 = { ++ .attr = { ++ .name = __stringify(errata_430973), ++ .mode = 0644, ++ }, ++ .show = rx51_errata_430973_show, ++ .store = rx51_errata_430973_store, ++}; ++ ++static void rx51_add_errata_430973_sysfs(void) ++{ ++ int ret = 0; ++ ret = sysfs_create_file(kernel_kobj, &rx51_errata_430973.attr); ++ if (ret) ++ printk(KERN_ERR "sysfs_create_file failed: %d\n", ret); ++} ++#endif ++ + static void __init rx51_init(void) + { + rx51_xceiv_init(); +@@ -176,6 +228,13 @@ + */ + omap_init_fb(); + omap_bt_init(&rx51_bt_config); ++ ++#ifdef CONFIG_ARM_ERRATA_430973 ++ printk(KERN_INFO "Enabling ARM errata 430973 workaround.\n"); ++ /* set IBE to 1 */ ++ rx51_secure_update_aux_cr(1 << 6, 0); ++ rx51_add_errata_430973_sysfs(); ++#endif + } + + static void __init rx51_map_io(void) diff --git a/kernel-power-2.6.28/debian/patches/series b/kernel-power-2.6.28/debian/patches/series index 469626f..4128432 100644 --- a/kernel-power-2.6.28/debian/patches/series +++ b/kernel-power-2.6.28/debian/patches/series @@ -74,3 +74,6 @@ USB-fix-kernel-oops-with-g_ether-and-windows.diff bq2415x_charger.patch bq2415x_kconfig.patch bq2415x_rx51.patch +rx51_add_secure_ppa_api.diff +rx51_arm_errata_430973.diff +clear_the_it_state_when_invoking_a_thumb_2_signal_handler.diff -- 1.7.9.5