Merge branch 'work/thumb2' into next
This commit is contained in:
commit
beb36c510b
|
@ -102,6 +102,18 @@ config AEABI
|
||||||
|
|
||||||
To use this you need GCC version 4.0.0 or later.
|
To use this you need GCC version 4.0.0 or later.
|
||||||
|
|
||||||
|
config THUMB2_BAREBOX
|
||||||
|
select ARM_ASM_UNIFIED
|
||||||
|
depends on CPU_V7
|
||||||
|
bool "Compile barebox in thumb-2 mode (read help)"
|
||||||
|
help
|
||||||
|
This enables compilation of barebox in thumb-2 mode which generates
|
||||||
|
~25% smaller binaries. Arm Assembly code needs some fixups to be able
|
||||||
|
to work correctly in thumb-2 mode. the barebox core should have these
|
||||||
|
fixups since most assembly code is derived from the Kernel. However,
|
||||||
|
your board lowlevel init code may break in thumb-2 mode. You have been
|
||||||
|
warned.
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
menu "Arm specific settings "
|
menu "Arm specific settings "
|
||||||
|
|
|
@ -39,8 +39,15 @@ ifeq ($(CONFIG_ARM_UNWIND),y)
|
||||||
CFLAGS_ABI +=-funwind-tables
|
CFLAGS_ABI +=-funwind-tables
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CPPFLAGS += $(CFLAGS_ABI) $(arch-y) $(tune-y) -msoft-float
|
ifeq ($(CONFIG_THUMB2_BAREBOX),y)
|
||||||
AFLAGS += -include asm/unified.h -msoft-float
|
AFLAGS_AUTOIT :=$(call as-option,-Wa$(comma)-mimplicit-it=always,-Wa$(comma)-mauto-it)
|
||||||
|
AFLAGS_NOWARN :=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W)
|
||||||
|
CFLAGS_THUMB2 :=-mthumb $(AFLAGS_AUTOIT) $(AFLAGS_NOWARN)
|
||||||
|
AFLAGS_THUMB2 :=$(CFLAGS_THUMB2) -Wa$(comma)-mthumb
|
||||||
|
endif
|
||||||
|
|
||||||
|
CPPFLAGS += $(CFLAGS_ABI) $(arch-y) $(tune-y) -msoft-float $(CFLAGS_THUMB2)
|
||||||
|
AFLAGS += -include asm/unified.h -msoft-float $(AFLAGS_THUMB2)
|
||||||
|
|
||||||
# Machine directory name. This list is sorted alphanumerically
|
# Machine directory name. This list is sorted alphanumerically
|
||||||
# by CONFIG_* macro name.
|
# by CONFIG_* macro name.
|
||||||
|
|
|
@ -46,13 +46,14 @@
|
||||||
#include <usb/fsl_usb2.h>
|
#include <usb/fsl_usb2.h>
|
||||||
#include <mach/usb.h>
|
#include <mach/usb.h>
|
||||||
#include <mach/devices-imx25.h>
|
#include <mach/devices-imx25.h>
|
||||||
|
#include <asm/barebox-arm-head.h>
|
||||||
|
|
||||||
extern unsigned long _stext;
|
extern unsigned long _stext;
|
||||||
extern void exception_vectors(void);
|
extern void exception_vectors(void);
|
||||||
|
|
||||||
void __naked __flash_header_start go(void)
|
void __naked __flash_header_start go(void)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__("b exception_vectors\n");
|
barebox_arm_head();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct imx_dcd_entry __dcd_entry_section dcd_entry[] = {
|
struct imx_dcd_entry __dcd_entry_section dcd_entry[] = {
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <mach/imx-flash-header.h>
|
#include <mach/imx-flash-header.h>
|
||||||
#include <mach/imx-regs.h>
|
#include <mach/imx-regs.h>
|
||||||
|
#include <asm/barebox-arm-head.h>
|
||||||
|
|
||||||
extern void exception_vectors(void);
|
extern void exception_vectors(void);
|
||||||
|
|
||||||
void __naked __flash_header_start go(void)
|
void __naked __flash_header_start go(void)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__("b exception_vectors\n");
|
barebox_arm_head();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct imx_dcd_entry __dcd_entry_section dcd_entry[] = {
|
struct imx_dcd_entry __dcd_entry_section dcd_entry[] = {
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <mach/imx-flash-header.h>
|
#include <mach/imx-flash-header.h>
|
||||||
|
#include <asm/barebox-arm-head.h>
|
||||||
|
|
||||||
extern unsigned long _stext;
|
extern unsigned long _stext;
|
||||||
|
|
||||||
void __naked __flash_header_start go(void)
|
void __naked __flash_header_start go(void)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__("b exception_vectors\n");
|
barebox_arm_head();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct imx_dcd_entry __dcd_entry_section dcd_entry[] = {
|
struct imx_dcd_entry __dcd_entry_section dcd_entry[] = {
|
||||||
|
|
|
@ -42,13 +42,14 @@
|
||||||
#include <i2c/i2c.h>
|
#include <i2c/i2c.h>
|
||||||
#include <mfd/mc34704.h>
|
#include <mfd/mc34704.h>
|
||||||
#include <mach/devices-imx25.h>
|
#include <mach/devices-imx25.h>
|
||||||
|
#include <asm/barebox-arm-head.h>
|
||||||
|
|
||||||
extern unsigned long _stext;
|
extern unsigned long _stext;
|
||||||
extern void exception_vectors(void);
|
extern void exception_vectors(void);
|
||||||
|
|
||||||
void __naked __flash_header_start go(void)
|
void __naked __flash_header_start go(void)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__("b exception_vectors\n");
|
barebox_arm_head();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct imx_dcd_entry __dcd_entry_section dcd_entry[] = {
|
struct imx_dcd_entry __dcd_entry_section dcd_entry[] = {
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <mach/imx-flash-header.h>
|
#include <mach/imx-flash-header.h>
|
||||||
#include <mach/imx-regs.h>
|
#include <mach/imx-regs.h>
|
||||||
|
#include <asm/barebox-arm-head.h>
|
||||||
|
|
||||||
extern void exception_vectors(void);
|
extern void exception_vectors(void);
|
||||||
|
|
||||||
void __naked __flash_header_start go(void)
|
void __naked __flash_header_start go(void)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__("b exception_vectors\n");
|
barebox_arm_head();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct imx_dcd_entry __dcd_entry_section dcd_entry[] = {
|
struct imx_dcd_entry __dcd_entry_section dcd_entry[] = {
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <mach/imx-flash-header.h>
|
#include <mach/imx-flash-header.h>
|
||||||
|
#include <asm/barebox-arm-head.h>
|
||||||
|
|
||||||
extern unsigned long _stext;
|
extern unsigned long _stext;
|
||||||
|
|
||||||
void __naked __flash_header_start go(void)
|
void __naked __flash_header_start go(void)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__("b exception_vectors\n");
|
barebox_arm_head();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct imx_dcd_entry __dcd_entry_section dcd_entry[] = {
|
struct imx_dcd_entry __dcd_entry_section dcd_entry[] = {
|
||||||
|
|
|
@ -16,10 +16,11 @@
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
#include <mach/imx-flash-header.h>
|
#include <mach/imx-flash-header.h>
|
||||||
|
#include <asm/barebox-arm-head.h>
|
||||||
|
|
||||||
void __naked __flash_header_start go(void)
|
void __naked __flash_header_start go(void)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__("b exception_vectors\n");
|
barebox_arm_head();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct imx_dcd_v2_entry __dcd_entry_section dcd_entry[] = {
|
struct imx_dcd_v2_entry __dcd_entry_section dcd_entry[] = {
|
||||||
|
|
|
@ -16,10 +16,11 @@
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
#include <mach/imx-flash-header.h>
|
#include <mach/imx-flash-header.h>
|
||||||
|
#include <asm/barebox-arm-head.h>
|
||||||
|
|
||||||
void __naked __flash_header_start go(void)
|
void __naked __flash_header_start go(void)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__("b exception_vectors\n");
|
barebox_arm_head();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct imx_dcd_v2_entry __dcd_entry_section dcd_entry[] = {
|
struct imx_dcd_v2_entry __dcd_entry_section dcd_entry[] = {
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
#include <init.h>
|
||||||
#include <command.h>
|
#include <command.h>
|
||||||
#include <cache.h>
|
#include <cache.h>
|
||||||
#include <asm/mmu.h>
|
#include <asm/mmu.h>
|
||||||
|
@ -89,3 +90,29 @@ void arch_shutdown(void)
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_THUMB2_BAREBOX
|
||||||
|
static void thumb2_execute(void *func, int argc, char *argv[])
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Switch back to arm mode before executing external
|
||||||
|
* programs.
|
||||||
|
*/
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"mov r0, #0\n"
|
||||||
|
"mov r1, %0\n"
|
||||||
|
"mov r2, %1\n"
|
||||||
|
"bx %2\n"
|
||||||
|
:
|
||||||
|
: "r" (argc - 1), "r" (&argv[1]), "r" (func)
|
||||||
|
: "r0", "r1", "r2"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int execute_init(void)
|
||||||
|
{
|
||||||
|
do_execute = thumb2_execute;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
postcore_initcall(execute_init);
|
||||||
|
#endif
|
||||||
|
|
|
@ -106,6 +106,7 @@ _STACK_START:
|
||||||
* exception handlers
|
* exception handlers
|
||||||
*/
|
*/
|
||||||
.section ".text","ax"
|
.section ".text","ax"
|
||||||
|
.arm
|
||||||
|
|
||||||
.align 5
|
.align 5
|
||||||
.globl undefined_instruction
|
.globl undefined_instruction
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sizes.h>
|
#include <sizes.h>
|
||||||
#include <asm/memory.h>
|
#include <asm/memory.h>
|
||||||
|
#include <asm/barebox-arm.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
|
|
||||||
|
@ -182,7 +183,6 @@ static void vectors_init(void)
|
||||||
{
|
{
|
||||||
u32 *exc, *zero = NULL;
|
u32 *exc, *zero = NULL;
|
||||||
void *vectors;
|
void *vectors;
|
||||||
extern unsigned long exception_vectors;
|
|
||||||
u32 cr;
|
u32 cr;
|
||||||
|
|
||||||
cr = get_cr();
|
cr = get_cr();
|
||||||
|
@ -210,7 +210,7 @@ static void vectors_init(void)
|
||||||
|
|
||||||
vectors = xmemalign(PAGE_SIZE, PAGE_SIZE);
|
vectors = xmemalign(PAGE_SIZE, PAGE_SIZE);
|
||||||
memset(vectors, 0, PAGE_SIZE);
|
memset(vectors, 0, PAGE_SIZE);
|
||||||
memcpy(vectors, &exception_vectors, ARM_VECTORS_SIZE);
|
memcpy(vectors, __exceptions_start, __exceptions_stop - __exceptions_start);
|
||||||
|
|
||||||
if (cr & CR_V)
|
if (cr & CR_V)
|
||||||
exc[256 - 16] = (u32)vectors | PTE_TYPE_SMALL | PTE_FLAGS_CACHED;
|
exc[256 - 16] = (u32)vectors | PTE_TYPE_SMALL | PTE_FLAGS_CACHED;
|
||||||
|
|
|
@ -23,37 +23,38 @@
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <init.h>
|
#include <init.h>
|
||||||
#include <asm/barebox-arm.h>
|
#include <asm/barebox-arm.h>
|
||||||
|
#include <asm/barebox-arm-head.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm-generic/memory_layout.h>
|
#include <asm-generic/memory_layout.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
|
|
||||||
void __naked __section(.text_entry) exception_vectors(void)
|
void __naked __section(.text_entry) start(void)
|
||||||
|
{
|
||||||
|
barebox_arm_head();
|
||||||
|
}
|
||||||
|
|
||||||
|
void __naked __section(.text_exceptions) exception_vectors(void)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
|
".arm\n"
|
||||||
"b reset\n" /* reset */
|
"b reset\n" /* reset */
|
||||||
#ifdef CONFIG_ARM_EXCEPTIONS
|
#ifdef CONFIG_ARM_EXCEPTIONS
|
||||||
"ldr pc, =undefined_instruction\n" /* undefined instruction */
|
"ldr pc, =undefined_instruction\n" /* undefined instruction */
|
||||||
"ldr pc, =software_interrupt\n" /* software interrupt (SWI) */
|
"ldr pc, =software_interrupt\n" /* software interrupt (SWI) */
|
||||||
"ldr pc, =prefetch_abort\n" /* prefetch abort */
|
"ldr pc, =prefetch_abort\n" /* prefetch abort */
|
||||||
"ldr pc, =data_abort\n" /* data abort */
|
"ldr pc, =data_abort\n" /* data abort */
|
||||||
"1: bne 1b\n" /* (reserved) */
|
"1: b 1b\n" /* (reserved) */
|
||||||
"ldr pc, =irq\n" /* irq (interrupt) */
|
"ldr pc, =irq\n" /* irq (interrupt) */
|
||||||
"ldr pc, =fiq\n" /* fiq (fast interrupt) */
|
"ldr pc, =fiq\n" /* fiq (fast interrupt) */
|
||||||
#else
|
#else
|
||||||
"1: bne 1b\n" /* undefined instruction */
|
"1: b 1b\n" /* undefined instruction */
|
||||||
"1: bne 1b\n" /* software interrupt (SWI) */
|
"1: b 1b\n" /* software interrupt (SWI) */
|
||||||
"1: bne 1b\n" /* prefetch abort */
|
"1: b 1b\n" /* prefetch abort */
|
||||||
"1: bne 1b\n" /* data abort */
|
"1: b 1b\n" /* data abort */
|
||||||
"1: bne 1b\n" /* (reserved) */
|
"1: b 1b\n" /* (reserved) */
|
||||||
"1: bne 1b\n" /* irq (interrupt) */
|
"1: b 1b\n" /* irq (interrupt) */
|
||||||
"1: bne 1b\n" /* fiq (fast interrupt) */
|
"1: b 1b\n" /* fiq (fast interrupt) */
|
||||||
#endif
|
#endif
|
||||||
".word 0x65726162\n" /* 'bare' */
|
|
||||||
".word 0x00786f62\n" /* 'box' */
|
|
||||||
".word _text\n" /* text base. If copied there,
|
|
||||||
* barebox can skip relocation
|
|
||||||
*/
|
|
||||||
".word _barebox_image_size\n" /* image size to copy */
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,7 +110,7 @@ void __naked __bare_init reset(void)
|
||||||
* Board code can jump here by either returning from board_init_lowlevel
|
* Board code can jump here by either returning from board_init_lowlevel
|
||||||
* or by calling this funtion directly.
|
* or by calling this funtion directly.
|
||||||
*/
|
*/
|
||||||
void __naked __bare_init board_init_lowlevel_return(void)
|
void __naked __section(.text_ll_return) board_init_lowlevel_return(void)
|
||||||
{
|
{
|
||||||
uint32_t r, addr;
|
uint32_t r, addr;
|
||||||
|
|
||||||
|
@ -124,7 +125,7 @@ void __naked __bare_init board_init_lowlevel_return(void)
|
||||||
__asm__ __volatile__("mov sp, %0" : : "r"(r));
|
__asm__ __volatile__("mov sp, %0" : : "r"(r));
|
||||||
|
|
||||||
/* Get start of binary image */
|
/* Get start of binary image */
|
||||||
addr -= (uint32_t)&board_init_lowlevel_return - TEXT_BASE;
|
addr -= (uint32_t)&__ll_return - TEXT_BASE;
|
||||||
|
|
||||||
/* relocate to link address if necessary */
|
/* relocate to link address if necessary */
|
||||||
if (addr != TEXT_BASE)
|
if (addr != TEXT_BASE)
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
#ifndef __ASM_ARM_HEAD_H
|
||||||
|
#define __ASM_ARM_HEAD_H
|
||||||
|
|
||||||
|
static inline void barebox_arm_head(void)
|
||||||
|
{
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
#ifdef CONFIG_THUMB2_BAREBOX
|
||||||
|
".arm\n"
|
||||||
|
"adr r9, 1f + 1\n"
|
||||||
|
"bx r9\n"
|
||||||
|
".thumb\n"
|
||||||
|
"1:\n"
|
||||||
|
"bl reset\n"
|
||||||
|
".rept 10\n"
|
||||||
|
"1: b 1b\n"
|
||||||
|
".endr\n"
|
||||||
|
#else
|
||||||
|
"b reset\n"
|
||||||
|
"1: b 1b\n"
|
||||||
|
"1: b 1b\n"
|
||||||
|
"1: b 1b\n"
|
||||||
|
"1: b 1b\n"
|
||||||
|
"1: b 1b\n"
|
||||||
|
"1: b 1b\n"
|
||||||
|
"1: b 1b\n"
|
||||||
|
#endif
|
||||||
|
".word 0x65726162\n" /* 'bare' */
|
||||||
|
".word 0x00786f62\n" /* 'box' */
|
||||||
|
".word _text\n" /* text base. If copied there,
|
||||||
|
* barebox can skip relocation
|
||||||
|
*/
|
||||||
|
".word _barebox_image_size\n" /* image size to copy */
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __ASM_ARM_HEAD_H */
|
|
@ -36,6 +36,9 @@ int cleanup_before_linux(void);
|
||||||
int board_init(void);
|
int board_init(void);
|
||||||
int dram_init (void);
|
int dram_init (void);
|
||||||
|
|
||||||
|
extern char __exceptions_start[], __exceptions_stop[];
|
||||||
|
extern char __ll_return[];
|
||||||
|
|
||||||
void board_init_lowlevel(void);
|
void board_init_lowlevel(void);
|
||||||
void board_init_lowlevel_return(void);
|
void board_init_lowlevel_return(void);
|
||||||
void arch_init_lowlevel(void);
|
void arch_init_lowlevel(void);
|
||||||
|
|
|
@ -24,10 +24,10 @@
|
||||||
.syntax unified
|
.syntax unified
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_THUMB2_KERNEL
|
#ifdef CONFIG_THUMB2_BAREBOX
|
||||||
|
|
||||||
#if __GNUC__ < 4
|
#if __GNUC__ < 4
|
||||||
#error Thumb-2 kernel requires gcc >= 4
|
#error Thumb-2 barebox requires gcc >= 4
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The CPSR bit describing the instruction set (Thumb) */
|
/* The CPSR bit describing the instruction set (Thumb) */
|
||||||
|
@ -40,7 +40,7 @@
|
||||||
#endif
|
#endif
|
||||||
#define BSYM(sym) sym + 1
|
#define BSYM(sym) sym + 1
|
||||||
|
|
||||||
#else /* !CONFIG_THUMB2_KERNEL */
|
#else /* !CONFIG_THUMB2_BAREBOX */
|
||||||
|
|
||||||
/* The CPSR bit describing the instruction set (ARM) */
|
/* The CPSR bit describing the instruction set (ARM) */
|
||||||
#define PSR_ISETSTATE 0
|
#define PSR_ISETSTATE 0
|
||||||
|
@ -52,7 +52,7 @@
|
||||||
#endif
|
#endif
|
||||||
#define BSYM(sym) sym
|
#define BSYM(sym) sym
|
||||||
|
|
||||||
#endif /* CONFIG_THUMB2_KERNEL */
|
#endif /* CONFIG_THUMB2_BAREBOX */
|
||||||
|
|
||||||
#ifndef CONFIG_ARM_ASM_UNIFIED
|
#ifndef CONFIG_ARM_ASM_UNIFIED
|
||||||
|
|
||||||
|
|
|
@ -255,6 +255,7 @@ void start_linux(void *adr, int swap, unsigned long initrd_address,
|
||||||
{
|
{
|
||||||
void (*kernel)(int zero, int arch, void *params) = adr;
|
void (*kernel)(int zero, int arch, void *params) = adr;
|
||||||
void *params = NULL;
|
void *params = NULL;
|
||||||
|
int architecture;
|
||||||
|
|
||||||
if (oftree) {
|
if (oftree) {
|
||||||
printf("booting Linux kernel with devicetree\n");
|
printf("booting Linux kernel with devicetree\n");
|
||||||
|
@ -272,5 +273,19 @@ void start_linux(void *adr, int swap, unsigned long initrd_address,
|
||||||
__asm__ __volatile__("mcr p15, 0, %0, c1, c0" :: "r" (reg));
|
__asm__ __volatile__("mcr p15, 0, %0, c1, c0" :: "r" (reg));
|
||||||
}
|
}
|
||||||
|
|
||||||
kernel(0, armlinux_get_architecture(), params);
|
architecture = armlinux_get_architecture();
|
||||||
|
|
||||||
|
#ifdef CONFIG_THUMB2_BAREBOX
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"mov r0, #0\n"
|
||||||
|
"mov r1, %0\n"
|
||||||
|
"mov r2, %1\n"
|
||||||
|
"bx %2\n"
|
||||||
|
:
|
||||||
|
: "r" (architecture), "r" (params), "r" (kernel)
|
||||||
|
: "r0", "r1", "r2"
|
||||||
|
);
|
||||||
|
#else
|
||||||
|
kernel(0, architecture, params);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
|
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
|
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
|
||||||
OUTPUT_ARCH(arm)
|
OUTPUT_ARCH(arm)
|
||||||
ENTRY(exception_vectors)
|
ENTRY(start)
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
. = TEXT_BASE;
|
. = TEXT_BASE;
|
||||||
|
@ -39,6 +39,8 @@ SECTIONS
|
||||||
_stext = .;
|
_stext = .;
|
||||||
_text = .;
|
_text = .;
|
||||||
*(.text_entry*)
|
*(.text_entry*)
|
||||||
|
__ll_return = .;
|
||||||
|
*(.text_ll_return*)
|
||||||
#ifdef CONFIG_ARCH_EP93XX
|
#ifdef CONFIG_ARCH_EP93XX
|
||||||
/* the EP93xx expects to find the pattern 'CRUS' at 0x1000 */
|
/* the EP93xx expects to find the pattern 'CRUS' at 0x1000 */
|
||||||
. = 0x1000;
|
. = 0x1000;
|
||||||
|
@ -47,6 +49,9 @@ SECTIONS
|
||||||
__bare_init_start = .;
|
__bare_init_start = .;
|
||||||
*(.text_bare_init*)
|
*(.text_bare_init*)
|
||||||
__bare_init_end = .;
|
__bare_init_end = .;
|
||||||
|
__exceptions_start = .;
|
||||||
|
KEEP(*(.text_exceptions*))
|
||||||
|
__exceptions_stop = .;
|
||||||
*(.text*)
|
*(.text*)
|
||||||
}
|
}
|
||||||
BAREBOX_BARE_INIT_SIZE
|
BAREBOX_BARE_INIT_SIZE
|
||||||
|
|
|
@ -62,7 +62,11 @@ static int do_go(int argc, char *argv[])
|
||||||
func = addr;
|
func = addr;
|
||||||
|
|
||||||
shutdown_barebox();
|
shutdown_barebox();
|
||||||
func(argc - 1, &argv[1]);
|
|
||||||
|
if (do_execute)
|
||||||
|
do_execute(func, argc - 1, &argv[1]);
|
||||||
|
else
|
||||||
|
func(argc - 1, &argv[1]);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The application returned. Since we have shutdown barebox and
|
* The application returned. Since we have shutdown barebox and
|
||||||
|
|
|
@ -125,3 +125,6 @@ void perror(const char *s)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(perror);
|
EXPORT_SYMBOL(perror);
|
||||||
|
|
||||||
|
void (*do_execute)(void *func, int argc, char *argv[]);
|
||||||
|
EXPORT_SYMBOL(do_execute);
|
||||||
|
|
|
@ -146,6 +146,12 @@ unsigned long strtoul_suffix(const char *str, char **endp, int base);
|
||||||
void start_barebox(void);
|
void start_barebox(void);
|
||||||
void shutdown_barebox(void);
|
void shutdown_barebox(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* architectures which have special calling conventions for
|
||||||
|
* executing programs should set this. Used by the 'go' command
|
||||||
|
*/
|
||||||
|
extern void (*do_execute)(void *func, int argc, char *argv[]);
|
||||||
|
|
||||||
void arch_shutdown(void);
|
void arch_shutdown(void);
|
||||||
|
|
||||||
int run_shell(void);
|
int run_shell(void);
|
||||||
|
|
Loading…
Reference in New Issue