diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2011-04-04 14:53:08 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2011-04-04 14:53:08 +0200 |
commit | 691dd27f7a9256c6da86bc94cc6eaba840ba9575 (patch) | |
tree | c786102100c5d332e630f83c5e4d7119548cd6c5 /arch/arm | |
parent | 6603a7defe3648ac06c034914245043f2714467a (diff) | |
parent | 6402171c907cb376d73c17a9f783b435b7626eb7 (diff) | |
download | barebox-691dd27f7a9256c6da86bc94cc6eaba840ba9575.tar.gz barebox-691dd27f7a9256c6da86bc94cc6eaba840ba9575.tar.xz |
Merge branch 'next'
Diffstat (limited to 'arch/arm')
48 files changed, 575 insertions, 109 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index bc54e58d67..aae0e992c8 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -115,6 +115,16 @@ config ARM_OPTIMZED_STRING_FUNCTIONS These functions work much faster than the normal versions but increase your binary size. +config ARM_UNWIND + bool "enable stack unwinding support" + depends on AEABI + help + This option enables stack unwinding support in barebox + using the information automatically generated by the + compiler. The resulting kernel image is slightly bigger but + the performance is not affected. Currently, this feature + only works with EABI compilers. If unsure say Y. + endmenu source common/Kconfig diff --git a/arch/arm/Makefile b/arch/arm/Makefile index d075efd88a..697c783fb2 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -34,6 +34,10 @@ else CFLAGS_ABI :=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) $(call cc-option,-mno-thumb-interwork,) endif +ifeq ($(CONFIG_ARM_UNWIND),y) +CFLAGS_ABI +=-funwind-tables +endif + CPPFLAGS += $(CFLAGS_ABI) $(arch-y) $(tune-y) AFLAGS += -include asm/unified.h diff --git a/arch/arm/boards/a9m2410/a9m2410.c b/arch/arm/boards/a9m2410/a9m2410.c index 57d8fa39fd..8cbaec59e3 100644 --- a/arch/arm/boards/a9m2410/a9m2410.c +++ b/arch/arm/boards/a9m2410/a9m2410.c @@ -176,7 +176,7 @@ device_initcall(a9m2410_devices_init); #ifdef CONFIG_S3C24XX_NAND_BOOT void __bare_init nand_boot(void) { - s3c24x0_nand_load_image((void *)TEXT_BASE, 256 * 1024, 0, 512); + s3c24x0_nand_load_image((void *)TEXT_BASE, 256 * 1024, 0); } #endif diff --git a/arch/arm/boards/a9m2440/a9m2440.c b/arch/arm/boards/a9m2440/a9m2440.c index 764cd65325..39b52761c5 100644 --- a/arch/arm/boards/a9m2440/a9m2440.c +++ b/arch/arm/boards/a9m2440/a9m2440.c @@ -182,7 +182,7 @@ device_initcall(a9m2440_devices_init); #ifdef CONFIG_S3C24XX_NAND_BOOT void __bare_init nand_boot(void) { - s3c24x0_nand_load_image((void *)TEXT_BASE, 256 * 1024, 0, 512); + s3c24x0_nand_load_image((void *)TEXT_BASE, 256 * 1024, 0); } #endif diff --git a/arch/arm/boards/at91sam9261ek/env/config b/arch/arm/boards/at91sam9261ek/env/config index 51bfbaa2cd..733326d483 100644 --- a/arch/arm/boards/at91sam9261ek/env/config +++ b/arch/arm/boards/at91sam9261ek/env/config @@ -10,8 +10,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net' or 'nand' -kernel_loc=net +# can be either 'nfs', 'tftp' or 'nand' +kernel_loc=tftp # can be either 'net', 'nand' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/at91sam9263ek/env/config b/arch/arm/boards/at91sam9263ek/env/config index 84f163d32d..f1cb751ee1 100644 --- a/arch/arm/boards/at91sam9263ek/env/config +++ b/arch/arm/boards/at91sam9263ek/env/config @@ -10,8 +10,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net' , 'nor' or 'nand' -kernel_loc=net +# can be either 'nfs', 'tftp', 'nor' or 'nand' +kernel_loc=tftp # can be either 'net', 'nor', 'nand' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/at91sam9m10g45ek/env/config b/arch/arm/boards/at91sam9m10g45ek/env/config index 9fcf4653fa..b8ca18dce7 100644 --- a/arch/arm/boards/at91sam9m10g45ek/env/config +++ b/arch/arm/boards/at91sam9m10g45ek/env/config @@ -10,8 +10,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net' or 'nand' -kernel_loc=net +# can be either 'nfs', 'tftp' or 'nand' +kernel_loc=tftp # can be either 'net', 'nand' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/chumby_falconwing/falconwing.c b/arch/arm/boards/chumby_falconwing/falconwing.c index d46431c302..15ca11b7a4 100644 --- a/arch/arm/boards/chumby_falconwing/falconwing.c +++ b/arch/arm/boards/chumby_falconwing/falconwing.c @@ -22,6 +22,7 @@ #include <environment.h> #include <errno.h> #include <mci.h> +#include <sizes.h> #include <usb/ehci.h> #include <asm/armlinux.h> #include <asm/io.h> @@ -46,13 +47,13 @@ static struct device_d sdram_dev = { .platform_data = &ram_pdata, }; -static struct stm_mci_platform_data mci_pdata = { +static struct mxs_mci_platform_data mci_pdata = { .caps = MMC_MODE_4BIT | MMC_MODE_HS | MMC_MODE_HS_52MHz, .voltages = MMC_VDD_32_33 | MMC_VDD_33_34, /* fixed to 3.3 V */ }; static struct device_d mci_dev = { - .name = "stm_mci", + .name = "mxs_mci", .map_base = IMX_SSP1_BASE, .platform_data = &mci_pdata, }; @@ -98,12 +99,16 @@ static struct fb_videomode falconwing_vmode = { .flag = 0, }; +#define MAX_FB_SIZE SZ_1M + static struct imx_fb_platformdata fb_mode = { .mode_list = &falconwing_vmode, .mode_cnt = 1, /* the NMA35 is a 24 bit display, but only 18 bits are connected */ .ld_intf_width = STMLCDIF_18BIT, .enable = chumby_fb_enable, + .fixed_screen = (void *)(0x40000000 + SZ_64M - MAX_FB_SIZE), + .fixed_screen_size = MAX_FB_SIZE, }; static struct device_d ldcif_dev = { @@ -292,11 +297,6 @@ static int falconwing_mmu_init(void) setup_dma_coherent(0x10000000); -#if TEXT_BASE & (0x100000 - 1) -#warning cannot create vector section. Adjust TEXT_BASE to a 1M boundary -#else - arm_create_section(0x0, TEXT_BASE, 1, PMD_SECT_DEF_UNCACHED); -#endif mmu_enable(); return 0; diff --git a/arch/arm/boards/eukrea_cpuimx25/env/config b/arch/arm/boards/eukrea_cpuimx25/env/config index 927010c255..5cedbf8216 100644 --- a/arch/arm/boards/eukrea_cpuimx25/env/config +++ b/arch/arm/boards/eukrea_cpuimx25/env/config @@ -15,7 +15,7 @@ ip=none #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net' or 'nand' +# can be either 'nfs', 'tftp' or 'nand' kernel_loc=nand # can be either 'net', 'nand' or 'initrd' rootfs_loc=nand diff --git a/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c b/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c index 4567cba16b..a7e99513df 100644 --- a/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c +++ b/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c @@ -153,11 +153,6 @@ static void eukrea_cpuimx27_mmu_init(void) setup_dma_coherent(0x10000000); -#if TEXT_BASE & (0x100000 - 1) -#warning cannot create vector section. Adjust TEXT_BASE to a 1M boundary -#else - arm_create_section(0x0, TEXT_BASE, 1, PMD_SECT_DEF_UNCACHED); -#endif mmu_enable(); } #else diff --git a/arch/arm/boards/eukrea_cpuimx35/env/config b/arch/arm/boards/eukrea_cpuimx35/env/config index 6ed6b244c6..776d19a24d 100644 --- a/arch/arm/boards/eukrea_cpuimx35/env/config +++ b/arch/arm/boards/eukrea_cpuimx35/env/config @@ -15,7 +15,7 @@ ip=none #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net' or 'nand' +# can be either 'nfs', 'tftp' or 'nand' kernel_loc=nand # can be either 'net', 'nand' or 'initrd' rootfs_loc=nand diff --git a/arch/arm/boards/eukrea_cpuimx35/eukrea_cpuimx35.c b/arch/arm/boards/eukrea_cpuimx35/eukrea_cpuimx35.c index f377793906..73bb2e1023 100644 --- a/arch/arm/boards/eukrea_cpuimx35/eukrea_cpuimx35.c +++ b/arch/arm/boards/eukrea_cpuimx35/eukrea_cpuimx35.c @@ -161,11 +161,6 @@ static int eukrea_cpuimx35_mmu_init(void) setup_dma_coherent(0x10000000); -#if TEXT_BASE & (0x100000 - 1) -#warning cannot create vector section. Adjust TEXT_BASE to a 1M boundary -#else - arm_create_section(0x0, TEXT_BASE, 1, PMD_SECT_DEF_UNCACHED); -#endif mmu_enable(); #ifdef CONFIG_CACHE_L2X0 diff --git a/arch/arm/boards/eukrea_cpuimx51/env/config b/arch/arm/boards/eukrea_cpuimx51/env/config index 51fcdde39b..737f8e32fe 100644 --- a/arch/arm/boards/eukrea_cpuimx51/env/config +++ b/arch/arm/boards/eukrea_cpuimx51/env/config @@ -18,7 +18,7 @@ ip=none #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net' or 'nand' +# can be either 'nfs', 'tftp' or 'nand' kernel_loc=nand # can be either 'net', 'nand' or 'initrd' rootfs_loc=nand diff --git a/arch/arm/boards/freescale-mx35-3-stack/env/config b/arch/arm/boards/freescale-mx35-3-stack/env/config index df01d4222f..ee9bd07e28 100644 --- a/arch/arm/boards/freescale-mx35-3-stack/env/config +++ b/arch/arm/boards/freescale-mx35-3-stack/env/config @@ -14,8 +14,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net', 'nor' or 'nand' -kernel_loc=net +# can be either 'nfs', 'tftp', 'nor' or 'nand' +kernel_loc=tftp # can be either 'net', 'nor', 'nand' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/freescale-mx51-pdk/board.c b/arch/arm/boards/freescale-mx51-pdk/board.c index ff779ca026..35d6153a48 100644 --- a/arch/arm/boards/freescale-mx51-pdk/board.c +++ b/arch/arm/boards/freescale-mx51-pdk/board.c @@ -96,12 +96,6 @@ static void babbage_mmu_init(void) setup_dma_coherent(0x20000000); -#if TEXT_BASE & (0x100000 - 1) -#warning cannot create vector section. Adjust TEXT_BASE to a 1M boundary -#else - arm_create_section(0x0, TEXT_BASE, 1, PMD_SECT_DEF_UNCACHED); -#endif - mmu_enable(); } #else diff --git a/arch/arm/boards/freescale-mx51-pdk/env/config b/arch/arm/boards/freescale-mx51-pdk/env/config index d9b84078f8..8e6b34eec1 100644 --- a/arch/arm/boards/freescale-mx51-pdk/env/config +++ b/arch/arm/boards/freescale-mx51-pdk/env/config @@ -14,8 +14,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net', 'nor' or 'nand' -kernel_loc=net +# can be either 'nfs', 'tftp', 'nor' or 'nand' +kernel_loc=tftp # can be either 'net', 'nor', 'nand' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/guf-cupid/board.c b/arch/arm/boards/guf-cupid/board.c index e30f8e5c8e..d04af78930 100644 --- a/arch/arm/boards/guf-cupid/board.c +++ b/arch/arm/boards/guf-cupid/board.c @@ -145,12 +145,6 @@ static int cupid_mmu_init(void) setup_dma_coherent(0x10000000); -#if TEXT_BASE & (0x100000 - 1) -#warning cannot create vector section. Adjust TEXT_BASE to a 1M boundary -#else - arm_create_section(0x0, TEXT_BASE, 1, PMD_SECT_DEF_UNCACHED); -#endif - mmu_enable(); #ifdef CONFIG_CACHE_L2X0 diff --git a/arch/arm/boards/guf-cupid/env/config b/arch/arm/boards/guf-cupid/env/config index 4db05b6c6d..cd11eb185d 100644 --- a/arch/arm/boards/guf-cupid/env/config +++ b/arch/arm/boards/guf-cupid/env/config @@ -14,8 +14,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net', 'nor' or 'nand' -kernel_loc=net +# can be either 'nfs', 'tftp', 'nor' or 'nand' +kernel_loc=tftp # can be either 'net', 'nor', 'nand' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/guf-neso/board.c b/arch/arm/boards/guf-neso/board.c index d371dd6a5a..c4b2fa11d5 100644 --- a/arch/arm/boards/guf-neso/board.c +++ b/arch/arm/boards/guf-neso/board.c @@ -167,11 +167,6 @@ static void neso_mmu_init(void) setup_dma_coherent(0x10000000); -#if TEXT_BASE & (0x100000 - 1) -#warning cannot create vector section. Adjust TEXT_BASE to a 1M boundary -#else - arm_create_section(0x0, TEXT_BASE, 1, PMD_SECT_DEF_UNCACHED); -#endif mmu_enable(); } #else diff --git a/arch/arm/boards/guf-neso/env/config b/arch/arm/boards/guf-neso/env/config index 6327e69217..162488f8b6 100644 --- a/arch/arm/boards/guf-neso/env/config +++ b/arch/arm/boards/guf-neso/env/config @@ -14,8 +14,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net', 'nor' or 'nand' -kernel_loc=net +# can be either 'nfs', 'tftp', 'nor' or 'nand' +kernel_loc=tftp # can be either 'net', 'nor', 'nand' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/karo-tx25/env/config b/arch/arm/boards/karo-tx25/env/config index e4ff7560a2..9113a87bc5 100644 --- a/arch/arm/boards/karo-tx25/env/config +++ b/arch/arm/boards/karo-tx25/env/config @@ -14,8 +14,8 @@ ip=dhcp #eth0.serverip=a.b.c.d #eth0.gateway=a.b.c.d -# can be either 'net' -kernel_loc=net +# can be either 'nfs' or 'tftp' +kernel_loc=tftp # can be either 'net' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/karo-tx28/env/config b/arch/arm/boards/karo-tx28/env/config index 9b302b8e5d..fdf57ea662 100644 --- a/arch/arm/boards/karo-tx28/env/config +++ b/arch/arm/boards/karo-tx28/env/config @@ -15,8 +15,8 @@ ip=dhcp #eth0.serverip=a.b.c.d #eth0.gateway=a.b.c.d -# can be either 'net' -kernel_loc=net +# can be either 'nfs' or 'tftp' +kernel_loc=tftp # can be either 'net' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/karo-tx28/tx28-stk5.c b/arch/arm/boards/karo-tx28/tx28-stk5.c index 92584426ff..81cb80c7e0 100644 --- a/arch/arm/boards/karo-tx28/tx28-stk5.c +++ b/arch/arm/boards/karo-tx28/tx28-stk5.c @@ -28,14 +28,15 @@ #include <mach/mci.h> #include <mach/fb.h> -static struct stm_mci_platform_data mci_pdata = { - .caps = MMC_MODE_4BIT | MMC_MODE_HS | MMC_MODE_HS_52MHz, +static struct mxs_mci_platform_data mci_pdata = { + .caps = MMC_MODE_4BIT, .voltages = MMC_VDD_32_33 | MMC_VDD_33_34, /* fixed to 3.3 V */ .f_min = 400 * 1000, + .f_max = 25000000, }; static struct device_d mci_socket = { - .name = "stm_mci", + .name = "mxs_mci", .map_base = IMX_SSP0_BASE, .platform_data = &mci_pdata, }; diff --git a/arch/arm/boards/karo-tx28/tx28.c b/arch/arm/boards/karo-tx28/tx28.c index 5692171253..1f47a8d30f 100644 --- a/arch/arm/boards/karo-tx28/tx28.c +++ b/arch/arm/boards/karo-tx28/tx28.c @@ -93,11 +93,6 @@ static int tx28_mmu_init(void) setup_dma_coherent(0x10000000); -#if TEXT_BASE & (0x100000 - 1) -#warning cannot create vector section. Adjust TEXT_BASE to a 1M boundary -#else - arm_create_section(0x0, TEXT_BASE, 1, PMD_SECT_DEF_UNCACHED); -#endif mmu_enable(); return 0; diff --git a/arch/arm/boards/mini2440/env/config b/arch/arm/boards/mini2440/env/config index b24877e9dc..ff6f1ea5ed 100644 --- a/arch/arm/boards/mini2440/env/config +++ b/arch/arm/boards/mini2440/env/config @@ -14,8 +14,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net', or 'nand' -kernel_loc=net +# can be either 'nfs', 'tftp' or 'nand' +kernel_loc=tftp # can be either 'net', 'nand' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/mini2440/mini2440.c b/arch/arm/boards/mini2440/mini2440.c index ab309a0a8f..448aa40a0d 100644 --- a/arch/arm/boards/mini2440/mini2440.c +++ b/arch/arm/boards/mini2440/mini2440.c @@ -281,7 +281,7 @@ device_initcall(mini2440_devices_init); #ifdef CONFIG_S3C24XX_NAND_BOOT void __bare_init nand_boot(void) { - s3c24x0_nand_load_image((void *)TEXT_BASE, 256 * 1024, 0, 512); + s3c24x0_nand_load_image((void *)TEXT_BASE, 256 * 1024, 0); } #endif diff --git a/arch/arm/boards/nhk8815/env/config b/arch/arm/boards/nhk8815/env/config index e657a76f99..7428c43713 100644 --- a/arch/arm/boards/nhk8815/env/config +++ b/arch/arm/boards/nhk8815/env/config @@ -10,8 +10,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net' or 'nand' -kernel_loc=net +# can be either 'nfs', 'tftp' or 'nand' +kernel_loc=tftp # can be either 'net', 'nand' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/pcm037/env/config b/arch/arm/boards/pcm037/env/config index df2f694c88..3748cc4c32 100644 --- a/arch/arm/boards/pcm037/env/config +++ b/arch/arm/boards/pcm037/env/config @@ -14,8 +14,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net', 'nor' or 'nand' -kernel_loc=net +# can be either 'nfs', 'tftp', nor' or 'nand' +kernel_loc=tftp # can be either 'net', 'nor', 'nand' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/pcm037/pcm037.c b/arch/arm/boards/pcm037/pcm037.c index ffecec21da..cb4ffe69f4 100644 --- a/arch/arm/boards/pcm037/pcm037.c +++ b/arch/arm/boards/pcm037/pcm037.c @@ -239,11 +239,6 @@ static void pcm037_mmu_init(void) setup_dma_coherent(0x10000000); -#if TEXT_BASE & (0x100000 - 1) -#warning cannot create vector section. Adjust TEXT_BASE to a 1M boundary -#else - arm_create_section(0x0, TEXT_BASE, 1, PMD_SECT_DEF_UNCACHED); -#endif mmu_enable(); #ifdef CONFIG_CACHE_L2X0 diff --git a/arch/arm/boards/pcm038/env/config b/arch/arm/boards/pcm038/env/config index a8be5c924d..9e28f5d1f2 100644 --- a/arch/arm/boards/pcm038/env/config +++ b/arch/arm/boards/pcm038/env/config @@ -14,8 +14,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net', 'nor' or 'nand' -kernel_loc=net +# can be either 'nfs', 'tftp', 'nor' or 'nand' +kernel_loc=tftp # can be either 'net', 'nor', 'nand' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/pcm038/pcm038.c b/arch/arm/boards/pcm038/pcm038.c index 1dbc6b6e10..3ca6650443 100644 --- a/arch/arm/boards/pcm038/pcm038.c +++ b/arch/arm/boards/pcm038/pcm038.c @@ -179,11 +179,6 @@ static void pcm038_mmu_init(void) setup_dma_coherent(0x10000000); -#if TEXT_BASE & (0x100000 - 1) -#warning cannot create vector section. Adjust TEXT_BASE to a 1M boundary -#else - arm_create_section(0x0, TEXT_BASE, 1, PMD_SECT_DEF_UNCACHED); -#endif mmu_enable(); } #else diff --git a/arch/arm/boards/pcm043/env/config b/arch/arm/boards/pcm043/env/config index 212b6a9cd8..e7f94f8dec 100644 --- a/arch/arm/boards/pcm043/env/config +++ b/arch/arm/boards/pcm043/env/config @@ -14,8 +14,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net', 'nor' or 'nand' -kernel_loc=net +# can be either 'nfs', 'tftp', 'nor' or 'nand' +kernel_loc=tftp # can be either 'net', 'nor', 'nand' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/pcm043/pcm043.c b/arch/arm/boards/pcm043/pcm043.c index 36bde4578c..7db3c836c3 100644 --- a/arch/arm/boards/pcm043/pcm043.c +++ b/arch/arm/boards/pcm043/pcm043.c @@ -133,12 +133,6 @@ static int pcm043_mmu_init(void) setup_dma_coherent(0x10000000); -#if TEXT_BASE & (0x100000 - 1) -#warning cannot create vector section. Adjust TEXT_BASE to a 1M boundary -#else - arm_create_section(0x0, TEXT_BASE, 1, PMD_SECT_DEF_UNCACHED); -#endif - mmu_enable(); #ifdef CONFIG_CACHE_L2X0 diff --git a/arch/arm/boards/phycard-i.MX27/env/config b/arch/arm/boards/phycard-i.MX27/env/config index d0670dec2c..0e20b48ffe 100644 --- a/arch/arm/boards/phycard-i.MX27/env/config +++ b/arch/arm/boards/phycard-i.MX27/env/config @@ -14,8 +14,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net', 'nor' or 'nand' -kernel_loc=net +# can be either 'nfs', 'tftp', 'nor' or 'nand' +kernel_loc=tftp # can be either 'net', 'nor', 'nand' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/phycard-i.MX27/pca100.c b/arch/arm/boards/phycard-i.MX27/pca100.c index c539ea1e7b..89c0a14ac7 100644 --- a/arch/arm/boards/phycard-i.MX27/pca100.c +++ b/arch/arm/boards/phycard-i.MX27/pca100.c @@ -106,11 +106,6 @@ static void pca100_mmu_init(void) setup_dma_coherent(0x10000000); -#if TEXT_BASE & (0x100000 - 1) -#warning cannot create vector section. Adjust TEXT_BASE to a 1M boundary -#else - arm_create_section(0x0, TEXT_BASE, 1, PMD_SECT_DEF_UNCACHED); -#endif mmu_enable(); } #else diff --git a/arch/arm/boards/pm9261/env/config b/arch/arm/boards/pm9261/env/config index f7e133ecf9..7933379b65 100644 --- a/arch/arm/boards/pm9261/env/config +++ b/arch/arm/boards/pm9261/env/config @@ -10,8 +10,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net' or 'nand' -kernel_loc=net +# can be either 'nfs', 'tftp' or 'nand' +kernel_loc=tftp # can be either 'net', 'nand' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/pm9g45/env/config b/arch/arm/boards/pm9g45/env/config index 9fcf4653fa..b8ca18dce7 100644 --- a/arch/arm/boards/pm9g45/env/config +++ b/arch/arm/boards/pm9g45/env/config @@ -10,8 +10,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net' or 'nand' -kernel_loc=net +# can be either 'nfs', 'tftp' or 'nand' +kernel_loc=tftp # can be either 'net', 'nand' or 'initrd' rootfs_loc=net diff --git a/arch/arm/boards/scb9328/scb9328.c b/arch/arm/boards/scb9328/scb9328.c index 35c7fdf730..a98d9fe26e 100644 --- a/arch/arm/boards/scb9328/scb9328.c +++ b/arch/arm/boards/scb9328/scb9328.c @@ -31,6 +31,7 @@ #include <fs.h> #include <fcntl.h> #include <dm9000.h> +#include <led.h> static struct device_d cfi_dev = { .id = -1, @@ -68,9 +69,30 @@ static struct device_d dm9000_dev = { .platform_data = &dm9000_data, }; -static int scb9328_devices_init(void) { +struct gpio_led leds[] = { + { + .gpio = 32 + 21, + }, { + .gpio = 32 + 22, + }, { + .gpio = 32 + 23, + }, { + .gpio = 32 + 24, + }, +}; + +static int scb9328_devices_init(void) +{ + int i; imx_gpio_mode(PA23_PF_CS5); + imx_gpio_mode(GPIO_PORTB | GPIO_GPIO | GPIO_OUT | 21); + imx_gpio_mode(GPIO_PORTB | GPIO_GPIO | GPIO_OUT | 22); + imx_gpio_mode(GPIO_PORTB | GPIO_GPIO | GPIO_OUT | 23); + imx_gpio_mode(GPIO_PORTB | GPIO_GPIO | GPIO_OUT | 24); + + for (i = 0; i < ARRAY_SIZE(leds); i++) + led_gpio_register(&leds[i]); /* CS3 becomes CS3 by clearing reset default bit 1 in FMCR */ FMCR = 0x1; diff --git a/arch/arm/boards/versatile/env/config b/arch/arm/boards/versatile/env/config index 9dec3f25bd..9c5ce61330 100644 --- a/arch/arm/boards/versatile/env/config +++ b/arch/arm/boards/versatile/env/config @@ -10,8 +10,8 @@ ip=dhcp #eth0.gateway=a.b.c.d #eth0.serverip=a.b.c.d -# can be either 'net' or 'nor' -kernel_loc=net +# can be either 'nfs', 'tftp' or 'nor' +kernel_loc=tftp # can be either 'net', 'nor' or 'initrd' rootfs_loc=initrd diff --git a/arch/arm/cpu/interrupts.c b/arch/arm/cpu/interrupts.c index 4a0b3f8db8..5168921682 100644 --- a/arch/arm/cpu/interrupts.c +++ b/arch/arm/cpu/interrupts.c @@ -27,6 +27,7 @@ #include <common.h> #include <asm/ptrace.h> +#include <asm/unwind.h> void do_undefined_instruction (struct pt_regs *pt_regs); void do_software_interrupt (struct pt_regs *pt_regs); @@ -115,6 +116,9 @@ void show_regs (struct pt_regs *regs) fast_interrupts_enabled (regs) ? "on" : "off", processor_modes[processor_mode (regs)], thumb_mode (regs) ? " (T)" : ""); +#ifdef CONFIG_ARM_UNWIND + unwind_backtrace(regs); +#endif } /** diff --git a/arch/arm/cpu/mmu.c b/arch/arm/cpu/mmu.c index 7b5686b609..8465d1a5a6 100644 --- a/arch/arm/cpu/mmu.c +++ b/arch/arm/cpu/mmu.c @@ -24,6 +24,52 @@ void arm_create_section(unsigned long virt, unsigned long phys, int size_m, } /* + * Create a second level translation table for the given virtual address. + * We initially create a flat uncached mapping on it. + * Not yet exported, but may be later if someone finds use for it. + */ +static u32 *arm_create_pte(unsigned long virt) +{ + u32 *table; + int i; + + table = memalign(0x400, 0x400); + + ttb[virt] = (unsigned long)table | PMD_TYPE_TABLE; + + for (i = 0; i < 256; i++) + table[i] = virt | PTE_TYPE_SMALL | PTE_SMALL_AP_UNO_SRW; + + return table; +} + +/* + * We have 8 exception vectors and the table consists of absolute + * jumps, so we need 8 * 4 bytes for the instructions and another + * 8 * 4 bytes for the addresses. + */ +#define ARM_VECTORS_SIZE (sizeof(u32) * 8 * 2) + +/* + * Allocate a page, map it to the zero page and copy our exception + * vectors there. + */ +static void vectors_init(void) +{ + u32 *exc; + void *vectors; + extern unsigned long exception_vectors; + + exc = arm_create_pte(0x0); + + vectors = xmemalign(PAGE_SIZE, PAGE_SIZE); + memset(vectors, 0, PAGE_SIZE); + memcpy(vectors, &exception_vectors, ARM_VECTORS_SIZE); + + exc[0] = (u32)vectors | PTE_TYPE_SMALL | PTE_SMALL_AP_UNO_SRW; +} + +/* * Prepare MMU for usage and create a flat mapping. Board * code is responsible to remap the SDRAM cached */ @@ -42,6 +88,8 @@ void mmu_init(void) /* create a flat mapping */ arm_create_section(0, 0, 4096, PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | PMD_TYPE_SECT); + + vectors_init(); } /* diff --git a/arch/arm/include/asm/stacktrace.h b/arch/arm/include/asm/stacktrace.h new file mode 100644 index 0000000000..10f70e1675 --- /dev/null +++ b/arch/arm/include/asm/stacktrace.h @@ -0,0 +1,16 @@ +#ifndef __ASM_STACKTRACE_H +#define __ASM_STACKTRACE_H + +struct stackframe { + unsigned long fp; + unsigned long sp; + unsigned long lr; + unsigned long pc; +}; + +extern int unwind_frame(struct stackframe *frame); +extern void walk_stackframe(struct stackframe *frame, + int (*fn)(struct stackframe *, void *), void *data); + +#endif /* __ASM_STACKTRACE_H */ + diff --git a/arch/arm/include/asm/unwind.h b/arch/arm/include/asm/unwind.h new file mode 100644 index 0000000000..1bc2a7c7be --- /dev/null +++ b/arch/arm/include/asm/unwind.h @@ -0,0 +1,54 @@ +/* + * arch/arm/include/asm/unwind.h + * + * Copyright (C) 2008 ARM Limited + * + * 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. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __ASM_UNWIND_H +#define __ASM_UNWIND_H + +#ifndef __ASSEMBLY__ + +/* Unwind reason code according the the ARM EABI documents */ +enum unwind_reason_code { + URC_OK = 0, /* operation completed successfully */ + URC_CONTINUE_UNWIND = 8, + URC_FAILURE = 9 /* unspecified failure of some kind */ +}; + +struct unwind_idx { + unsigned long addr; + unsigned long insn; +}; + +struct unwind_table { + struct list_head list; + struct unwind_idx *start; + struct unwind_idx *stop; + unsigned long begin_addr; + unsigned long end_addr; +}; + +extern struct unwind_table *unwind_table_add(unsigned long start, + unsigned long size, + unsigned long text_addr, + unsigned long text_size); +extern void unwind_table_del(struct unwind_table *tab); +extern void unwind_backtrace(struct pt_regs *regs); + +#endif /* !__ASSEMBLY__ */ + +#endif /* __ASM_UNWIND_H */ diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index 89cb72b30f..3a010838b7 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile @@ -14,7 +14,7 @@ obj-y += ashldi3.o obj-y += lshrdi3.o obj-$(CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS) += memcpy.o obj-$(CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS) += memset.o - +obj-$(CONFIG_ARM_UNWIND) += unwind.o obj-$(CONFIG_MODULES) += module.o extra-$(CONFIG_GENERIC_LINKER_SCRIPT) += barebox.lds diff --git a/arch/arm/lib/barebox.lds.S b/arch/arm/lib/barebox.lds.S index cc74b2f07d..7683f739eb 100644 --- a/arch/arm/lib/barebox.lds.S +++ b/arch/arm/lib/barebox.lds.S @@ -51,6 +51,22 @@ SECTIONS . = ALIGN(4); .rodata : { *(.rodata*) } +#ifdef CONFIG_ARM_UNWIND + /* + * Stack unwinding tables + */ + . = ALIGN(8); + .ARM.unwind_idx : { + __start_unwind_idx = .; + *(.ARM.exidx*) + __stop_unwind_idx = .; + } + .ARM.unwind_tab : { + __start_unwind_tab = .; + *(.ARM.extab*) + __stop_unwind_tab = .; + } +#endif _etext = .; /* End of text and rodata section */ . = ALIGN(4); diff --git a/arch/arm/lib/unwind.c b/arch/arm/lib/unwind.c new file mode 100644 index 0000000000..62d26af5d1 --- /dev/null +++ b/arch/arm/lib/unwind.c @@ -0,0 +1,344 @@ +#include <common.h> +#include <init.h> +#include <asm/stacktrace.h> +#include <asm/unwind.h> +#include <asm-generic/sections.h> + +/* Dummy functions to avoid linker complaints */ +void __aeabi_unwind_cpp_pr0(void) +{ +}; +EXPORT_SYMBOL(__aeabi_unwind_cpp_pr0); + +void __aeabi_unwind_cpp_pr1(void) +{ +}; +EXPORT_SYMBOL(__aeabi_unwind_cpp_pr1); + +void __aeabi_unwind_cpp_pr2(void) +{ +}; +EXPORT_SYMBOL(__aeabi_unwind_cpp_pr2); + +struct unwind_ctrl_block { + unsigned long vrs[16]; /* virtual register set */ + unsigned long *insn; /* pointer to the current instructions word */ + int entries; /* number of entries left to interpret */ + int byte; /* current byte number in the instructions word */ +}; + +enum regs { + FP = 11, + SP = 13, + LR = 14, + PC = 15 +}; + +#define THREAD_SIZE 8192 + +extern struct unwind_idx __start_unwind_idx[]; +extern struct unwind_idx __stop_unwind_idx[]; + +/* Convert a prel31 symbol to an absolute address */ +#define prel31_to_addr(ptr) \ +({ \ + /* sign-extend to 32 bits */ \ + long offset = (((long)*(ptr)) << 1) >> 1; \ + (unsigned long)(ptr) + offset; \ +}) + +static inline int is_kernel_text(unsigned long addr) +{ + if ((addr >= (unsigned long)_stext && addr <= (unsigned long)_etext)) + return 1; + return 0; +} + +void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame) +{ +#ifdef CONFIG_KALLSYMS + printk("[<%08lx>] (%pS) from [<%08lx>] (%pS)\n", where, (void *)where, from, (void *)from); +#else + printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from); +#endif +} + +/* + * Binary search in the unwind index. The entries entries are + * guaranteed to be sorted in ascending order by the linker. + */ +static struct unwind_idx *search_index(unsigned long addr, + struct unwind_idx *first, + struct unwind_idx *last) +{ + pr_debug("%s(%08lx, %p, %p)\n", __func__, addr, first, last); + + if (addr < first->addr) { + pr_warning("unwind: Unknown symbol address %08lx\n", addr); + return NULL; + } else if (addr >= last->addr) + return last; + + while (first < last - 1) { + struct unwind_idx *mid = first + ((last - first + 1) >> 1); + + if (addr < mid->addr) + last = mid; + else + first = mid; + } + + return first; +} + +static struct unwind_idx *unwind_find_idx(unsigned long addr) +{ + struct unwind_idx *idx = NULL; + + pr_debug("%s(%08lx)\n", __func__, addr); + + if (is_kernel_text(addr)) + /* main unwind table */ + idx = search_index(addr, __start_unwind_idx, + __stop_unwind_idx - 1); + else { + /* module unwinding not supported */ + } + + pr_debug("%s: idx = %p\n", __func__, idx); + return idx; +} + +static unsigned long unwind_get_byte(struct unwind_ctrl_block *ctrl) +{ + unsigned long ret; + + if (ctrl->entries <= 0) { + pr_warning("unwind: Corrupt unwind table\n"); + return 0; + } + + ret = (*ctrl->insn >> (ctrl->byte * 8)) & 0xff; + + if (ctrl->byte == 0) { + ctrl->insn++; + ctrl->entries--; + ctrl->byte = 3; + } else + ctrl->byte--; + + return ret; +} + +/* + * Execute the current unwind instruction. + */ +static int unwind_exec_insn(struct unwind_ctrl_block *ctrl) +{ + unsigned long insn = unwind_get_byte(ctrl); + + pr_debug("%s: insn = %08lx\n", __func__, insn); + + if ((insn & 0xc0) == 0x00) + ctrl->vrs[SP] += ((insn & 0x3f) << 2) + 4; + else if ((insn & 0xc0) == 0x40) + ctrl->vrs[SP] -= ((insn & 0x3f) << 2) + 4; + else if ((insn & 0xf0) == 0x80) { + unsigned long mask; + unsigned long *vsp = (unsigned long *)ctrl->vrs[SP]; + int load_sp, reg = 4; + + insn = (insn << 8) | unwind_get_byte(ctrl); + mask = insn & 0x0fff; + if (mask == 0) { + pr_warning("unwind: 'Refuse to unwind' instruction %04lx\n", + insn); + return -URC_FAILURE; + } + + /* pop R4-R15 according to mask */ + load_sp = mask & (1 << (13 - 4)); + while (mask) { + if (mask & 1) + ctrl->vrs[reg] = *vsp++; + mask >>= 1; + reg++; + } + if (!load_sp) + ctrl->vrs[SP] = (unsigned long)vsp; + } else if ((insn & 0xf0) == 0x90 && + (insn & 0x0d) != 0x0d) + ctrl->vrs[SP] = ctrl->vrs[insn & 0x0f]; + else if ((insn & 0xf0) == 0xa0) { + unsigned long *vsp = (unsigned long *)ctrl->vrs[SP]; + int reg; + + /* pop R4-R[4+bbb] */ + for (reg = 4; reg <= 4 + (insn & 7); reg++) + ctrl->vrs[reg] = *vsp++; + if (insn & 0x80) + ctrl->vrs[14] = *vsp++; + ctrl->vrs[SP] = (unsigned long)vsp; + } else if (insn == 0xb0) { + if (ctrl->vrs[PC] == 0) + ctrl->vrs[PC] = ctrl->vrs[LR]; + /* no further processing */ + ctrl->entries = 0; + } else if (insn == 0xb1) { + unsigned long mask = unwind_get_byte(ctrl); + unsigned long *vsp = (unsigned long *)ctrl->vrs[SP]; + int reg = 0; + + if (mask == 0 || mask & 0xf0) { + pr_warning("unwind: Spare encoding %04lx\n", + (insn << 8) | mask); + return -URC_FAILURE; + } + + /* pop R0-R3 according to mask */ + while (mask) { + if (mask & 1) + ctrl->vrs[reg] = *vsp++; + mask >>= 1; + reg++; + } + ctrl->vrs[SP] = (unsigned long)vsp; + } else if (insn == 0xb2) { + unsigned long uleb128 = unwind_get_byte(ctrl); + + ctrl->vrs[SP] += 0x204 + (uleb128 << 2); + } else { + pr_warning("unwind: Unhandled instruction %02lx\n", insn); + return -URC_FAILURE; + } + + pr_debug("%s: fp = %08lx sp = %08lx lr = %08lx pc = %08lx\n", __func__, + ctrl->vrs[FP], ctrl->vrs[SP], ctrl->vrs[LR], ctrl->vrs[PC]); + + return URC_OK; +} + +/* + * Unwind a single frame starting with *sp for the symbol at *pc. It + * updates the *pc and *sp with the new values. + */ +int unwind_frame(struct stackframe *frame) +{ + unsigned long high, low; + struct unwind_idx *idx; + struct unwind_ctrl_block ctrl; + + /* only go to a higher address on the stack */ + low = frame->sp; + high = ALIGN(low, THREAD_SIZE); + + pr_debug("%s(pc = %08lx lr = %08lx sp = %08lx)\n", __func__, + frame->pc, frame->lr, frame->sp); + + if (!is_kernel_text(frame->pc)) + return -URC_FAILURE; + + idx = unwind_find_idx(frame->pc); + if (!idx) { + pr_warning("unwind: Index not found %08lx\n", frame->pc); + return -URC_FAILURE; + } + + ctrl.vrs[FP] = frame->fp; + ctrl.vrs[SP] = frame->sp; + ctrl.vrs[LR] = frame->lr; + ctrl.vrs[PC] = 0; + + if (idx->insn == 1) + /* can't unwind */ + return -URC_FAILURE; + else if ((idx->insn & 0x80000000) == 0) + /* prel31 to the unwind table */ + ctrl.insn = (unsigned long *)prel31_to_addr(&idx->insn); + else if ((idx->insn & 0xff000000) == 0x80000000) + /* only personality routine 0 supported in the index */ + ctrl.insn = &idx->insn; + else { + pr_warning("unwind: Unsupported personality routine %08lx in the index at %p\n", + idx->insn, idx); + return -URC_FAILURE; + } + + /* check the personality routine */ + if ((*ctrl.insn & 0xff000000) == 0x80000000) { + ctrl.byte = 2; + ctrl.entries = 1; + } else if ((*ctrl.insn & 0xff000000) == 0x81000000) { + ctrl.byte = 1; + ctrl.entries = 1 + ((*ctrl.insn & 0x00ff0000) >> 16); + } else { + pr_warning("unwind: Unsupported personality routine %08lx at %p\n", + *ctrl.insn, ctrl.insn); + return -URC_FAILURE; + } + + while (ctrl.entries > 0) { + int urc = unwind_exec_insn(&ctrl); + if (urc < 0) + return urc; + if (ctrl.vrs[SP] < low || ctrl.vrs[SP] >= high) + return -URC_FAILURE; + } + + if (ctrl.vrs[PC] == 0) + ctrl.vrs[PC] = ctrl.vrs[LR]; + + /* check for infinite loop */ + if (frame->pc == ctrl.vrs[PC]) + return -URC_FAILURE; + + frame->fp = ctrl.vrs[FP]; + frame->sp = ctrl.vrs[SP]; + frame->lr = ctrl.vrs[LR]; + frame->pc = ctrl.vrs[PC]; + + return URC_OK; +} + +void unwind_backtrace(struct pt_regs *regs) +{ + struct stackframe frame; + register unsigned long current_sp asm ("sp"); + + pr_debug("%s\n", __func__); + + if (regs) { + frame.fp = regs->ARM_fp; + frame.sp = regs->ARM_sp; + frame.lr = regs->ARM_lr; + /* PC might be corrupted, use LR in that case. */ + frame.pc = is_kernel_text(regs->ARM_pc) + ? regs->ARM_pc : regs->ARM_lr; + } else { + frame.sp = current_sp; + frame.lr = (unsigned long)__builtin_return_address(0); + frame.pc = (unsigned long)unwind_backtrace; + } + + while (1) { + int urc; + unsigned long where = frame.pc; + + urc = unwind_frame(&frame); + if (urc < 0) + break; + dump_backtrace_entry(where, frame.pc, frame.sp - 4); + } +} + +static int unwind_init(void) +{ + struct unwind_idx *idx; + + /* Convert the symbol addresses to absolute values */ + for (idx = __start_unwind_idx; idx < __stop_unwind_idx; idx++) + idx->addr = prel31_to_addr(&idx->addr); + + return 0; +} +core_initcall(unwind_init); diff --git a/arch/arm/mach-mxs/include/mach/mci.h b/arch/arm/mach-mxs/include/mach/mci.h index b9249085ae..1090c1a59c 100644 --- a/arch/arm/mach-mxs/include/mach/mci.h +++ b/arch/arm/mach-mxs/include/mach/mci.h @@ -18,7 +18,7 @@ #ifndef __MACH_MMC_H #define __MACH_MMC_H -struct stm_mci_platform_data { +struct mxs_mci_platform_data { unsigned caps; /**< supported operating modes (MMC_MODE_*) */ unsigned voltages; /**< supported voltage range (MMC_VDD_*) */ unsigned f_min; /**< min operating frequency in Hz (0 -> no limit) */ diff --git a/arch/arm/mach-s3c24xx/include/mach/s3c24x0-nand.h b/arch/arm/mach-s3c24xx/include/mach/s3c24x0-nand.h index d06287e4ff..7610b4e29d 100644 --- a/arch/arm/mach-s3c24xx/include/mach/s3c24x0-nand.h +++ b/arch/arm/mach-s3c24xx/include/mach/s3c24x0-nand.h @@ -19,7 +19,7 @@ */ #ifdef CONFIG_S3C24XX_NAND_BOOT -extern void s3c24x0_nand_load_image(void*, int, int, int); +extern void s3c24x0_nand_load_image(void*, int, int); #endif /** |