Commit d86bfb16 authored by Barry Song's avatar Barry Song Committed by Mike Frysinger

Blackfin: initial XIP support

Signed-off-by: default avatarBarry Song <barry.song@analog.com>
Signed-off-by: default avatarMike Frysinger <vapier@gentoo.org>
parent aad16f32
...@@ -26,9 +26,9 @@ config BLACKFIN ...@@ -26,9 +26,9 @@ config BLACKFIN
select HAVE_FUNCTION_GRAPH_TRACER select HAVE_FUNCTION_GRAPH_TRACER
select HAVE_FUNCTION_TRACER select HAVE_FUNCTION_TRACER
select HAVE_IDE select HAVE_IDE
select HAVE_KERNEL_GZIP select HAVE_KERNEL_GZIP if RAMKERNEL
select HAVE_KERNEL_BZIP2 select HAVE_KERNEL_BZIP2 if RAMKERNEL
select HAVE_KERNEL_LZMA select HAVE_KERNEL_LZMA if RAMKERNEL
select HAVE_OPROFILE select HAVE_OPROFILE
select ARCH_WANT_OPTIONAL_GPIOLIB select ARCH_WANT_OPTIONAL_GPIOLIB
...@@ -407,10 +407,18 @@ config BOOT_LOAD ...@@ -407,10 +407,18 @@ config BOOT_LOAD
config ROM_BASE config ROM_BASE
hex "Kernel ROM Base" hex "Kernel ROM Base"
depends on ROMKERNEL depends on ROMKERNEL
default "0x20040000" default "0x20040040"
range 0x20000000 0x20400000 if !(BF54x || BF561) range 0x20000000 0x20400000 if !(BF54x || BF561)
range 0x20000000 0x30000000 if (BF54x || BF561) range 0x20000000 0x30000000 if (BF54x || BF561)
help help
Make sure your ROM base does not include any file-header
information that is prepended to the kernel.
For example, the bootable U-Boot format (created with
mkimage) has a 64 byte header (0x40). So while the image
you write to flash might start at say 0x20080000, you have
to add 0x40 to get the kernel's ROM base as it will come
after the header.
comment "Clock/PLL Setup" comment "Clock/PLL Setup"
......
...@@ -14,6 +14,9 @@ OBJCOPYFLAGS := -O binary -R .note -R .comment -S ...@@ -14,6 +14,9 @@ OBJCOPYFLAGS := -O binary -R .note -R .comment -S
GZFLAGS := -9 GZFLAGS := -9
KBUILD_CFLAGS += $(call cc-option,-mno-fdpic) KBUILD_CFLAGS += $(call cc-option,-mno-fdpic)
ifeq ($(CONFIG_ROMKERNEL),y)
KBUILD_CFLAGS += -mlong-calls
endif
KBUILD_AFLAGS += $(call cc-option,-mno-fdpic) KBUILD_AFLAGS += $(call cc-option,-mno-fdpic)
CFLAGS_MODULE += -mlong-calls CFLAGS_MODULE += -mlong-calls
LDFLAGS_MODULE += -m elf32bfin LDFLAGS_MODULE += -m elf32bfin
...@@ -138,7 +141,7 @@ archclean: ...@@ -138,7 +141,7 @@ archclean:
INSTALL_PATH ?= /tftpboot INSTALL_PATH ?= /tftpboot
boot := arch/$(ARCH)/boot boot := arch/$(ARCH)/boot
BOOT_TARGETS = vmImage vmImage.bin vmImage.bz2 vmImage.gz vmImage.lzma BOOT_TARGETS = vmImage vmImage.bin vmImage.bz2 vmImage.gz vmImage.lzma vmImage.xip
PHONY += $(BOOT_TARGETS) install PHONY += $(BOOT_TARGETS) install
KBUILD_IMAGE := $(boot)/vmImage KBUILD_IMAGE := $(boot)/vmImage
...@@ -156,6 +159,7 @@ define archhelp ...@@ -156,6 +159,7 @@ define archhelp
echo ' vmImage.bz2 - Kernel-only image for U-Boot (arch/$(ARCH)/boot/vmImage.bz2)' echo ' vmImage.bz2 - Kernel-only image for U-Boot (arch/$(ARCH)/boot/vmImage.bz2)'
echo '* vmImage.gz - Kernel-only image for U-Boot (arch/$(ARCH)/boot/vmImage.gz)' echo '* vmImage.gz - Kernel-only image for U-Boot (arch/$(ARCH)/boot/vmImage.gz)'
echo ' vmImage.lzma - Kernel-only image for U-Boot (arch/$(ARCH)/boot/vmImage.lzma)' echo ' vmImage.lzma - Kernel-only image for U-Boot (arch/$(ARCH)/boot/vmImage.lzma)'
echo ' vmImage.xip - XIP Kernel-only image for U-Boot (arch/$(ARCH)/boot/vmImage.xip)'
echo ' install - Install kernel using' echo ' install - Install kernel using'
echo ' (your) ~/bin/$(INSTALLKERNEL) or' echo ' (your) ~/bin/$(INSTALLKERNEL) or'
echo ' (distribution) PATH: $(INSTALLKERNEL) or' echo ' (distribution) PATH: $(INSTALLKERNEL) or'
......
...@@ -8,14 +8,18 @@ ...@@ -8,14 +8,18 @@
MKIMAGE := $(srctree)/scripts/mkuboot.sh MKIMAGE := $(srctree)/scripts/mkuboot.sh
targets := vmImage vmImage.bin vmImage.bz2 vmImage.gz vmImage.lzma targets := vmImage vmImage.bin vmImage.bz2 vmImage.gz vmImage.lzma vmImage.xip
extra-y += vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma extra-y += vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma vmlinux.bin.xip
UIMAGE_OPTS-y :=
UIMAGE_OPTS-$(CONFIG_RAMKERNEL) += -a $(CONFIG_BOOT_LOAD)
UIMAGE_OPTS-$(CONFIG_ROMKERNEL) += -a $(CONFIG_ROM_BASE) -x
quiet_cmd_uimage = UIMAGE $@ quiet_cmd_uimage = UIMAGE $@
cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A $(ARCH) -O linux -T kernel \ cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A $(ARCH) -O linux -T kernel \
-C $(2) -n '$(MACHINE)-$(KERNELRELEASE)' -a $(CONFIG_BOOT_LOAD) \ -C $(2) -n '$(MACHINE)-$(KERNELRELEASE)' \
-e $(shell $(NM) vmlinux | awk '$$NF == "__start" {print $$1}') \ -e $(shell $(NM) vmlinux | awk '$$NF == "__start" {print $$1}') \
-d $< $@ $(UIMAGE_OPTS-y) -d $< $@
$(obj)/vmlinux.bin: vmlinux FORCE $(obj)/vmlinux.bin: vmlinux FORCE
$(call if_changed,objcopy) $(call if_changed,objcopy)
...@@ -29,6 +33,12 @@ $(obj)/vmlinux.bin.bz2: $(obj)/vmlinux.bin FORCE ...@@ -29,6 +33,12 @@ $(obj)/vmlinux.bin.bz2: $(obj)/vmlinux.bin FORCE
$(obj)/vmlinux.bin.lzma: $(obj)/vmlinux.bin FORCE $(obj)/vmlinux.bin.lzma: $(obj)/vmlinux.bin FORCE
$(call if_changed,lzma) $(call if_changed,lzma)
# The mkimage tool wants 64bytes prepended to the image
quiet_cmd_mk_bin_xip = BIN $@
cmd_mk_bin_xip = ( printf '%64s' | tr ' ' '\377' ; cat $< ) > $@
$(obj)/vmlinux.bin.xip: $(obj)/vmlinux.bin FORCE
$(call if_changed,mk_bin_xip)
$(obj)/vmImage.bin: $(obj)/vmlinux.bin $(obj)/vmImage.bin: $(obj)/vmlinux.bin
$(call if_changed,uimage,none) $(call if_changed,uimage,none)
...@@ -41,10 +51,15 @@ $(obj)/vmImage.gz: $(obj)/vmlinux.bin.gz ...@@ -41,10 +51,15 @@ $(obj)/vmImage.gz: $(obj)/vmlinux.bin.gz
$(obj)/vmImage.lzma: $(obj)/vmlinux.bin.lzma $(obj)/vmImage.lzma: $(obj)/vmlinux.bin.lzma
$(call if_changed,uimage,lzma) $(call if_changed,uimage,lzma)
$(obj)/vmImage.xip: $(obj)/vmlinux.bin.xip
$(call if_changed,uimage,none)
suffix-y := bin suffix-y := bin
suffix-$(CONFIG_KERNEL_GZIP) := gz suffix-$(CONFIG_KERNEL_GZIP) := gz
suffix-$(CONFIG_KERNEL_BZIP2) := bz2 suffix-$(CONFIG_KERNEL_BZIP2) := bz2
suffix-$(CONFIG_KERNEL_LZMA) := lzma suffix-$(CONFIG_KERNEL_LZMA) := lzma
suffix-$(CONFIG_ROMKERNEL) := xip
$(obj)/vmImage: $(obj)/vmImage.$(suffix-y) $(obj)/vmImage: $(obj)/vmImage.$(suffix-y)
@ln -sf $(notdir $<) $@ @ln -sf $(notdir $<) $@
......
...@@ -374,3 +374,13 @@ ...@@ -374,3 +374,13 @@
(R7:0, P5:0) = [SP++]; (R7:0, P5:0) = [SP++];
.endm .endm
.macro pseudo_long_call func:req, scratch:req
#ifdef CONFIG_ROMKERNEL
\scratch\().l = \func;
\scratch\().h = \func;
call (\scratch);
#else
call \func;
#endif
.endm
...@@ -21,6 +21,9 @@ extern unsigned long memory_start, memory_end, physical_mem_end; ...@@ -21,6 +21,9 @@ extern unsigned long memory_start, memory_end, physical_mem_end;
extern char _stext_l1[], _etext_l1[], _text_l1_lma[], __weak _text_l1_len[]; extern char _stext_l1[], _etext_l1[], _text_l1_lma[], __weak _text_l1_len[];
extern char _sdata_l1[], _edata_l1[], _sbss_l1[], _ebss_l1[], extern char _sdata_l1[], _edata_l1[], _sbss_l1[], _ebss_l1[],
_data_l1_lma[], __weak _data_l1_len[]; _data_l1_lma[], __weak _data_l1_len[];
#ifdef CONFIG_ROMKERNEL
extern char _data_lma[], _data_len[], _sinitdata[], _einitdata[], _init_data_lma[], _init_data_len[];
#endif
extern char _sdata_b_l1[], _edata_b_l1[], _sbss_b_l1[], _ebss_b_l1[], extern char _sdata_b_l1[], _edata_b_l1[], _sbss_b_l1[], _ebss_b_l1[],
_data_b_l1_lma[], __weak _data_b_l1_len[]; _data_b_l1_lma[], __weak _data_b_l1_len[];
extern char _stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], extern char _stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[],
......
...@@ -64,6 +64,15 @@ void __init generate_cplb_tables_cpu(unsigned int cpu) ...@@ -64,6 +64,15 @@ void __init generate_cplb_tables_cpu(unsigned int cpu)
icplb_tbl[cpu][i_i++].data = i_data | (addr == 0 ? CPLB_USER_RD : 0); icplb_tbl[cpu][i_i++].data = i_data | (addr == 0 ? CPLB_USER_RD : 0);
} }
#ifdef CONFIG_ROMKERNEL
/* Cover kernel XIP flash area */
addr = CONFIG_ROM_BASE & ~(4 * 1024 * 1024 - 1);
dcplb_tbl[cpu][i_d].addr = addr;
dcplb_tbl[cpu][i_d++].data = d_data | CPLB_USER_RD;
icplb_tbl[cpu][i_i].addr = addr;
icplb_tbl[cpu][i_i++].data = i_data | CPLB_USER_RD;
#endif
/* Cover L1 memory. One 4M area for code and data each is enough. */ /* Cover L1 memory. One 4M area for code and data each is enough. */
#if L1_DATA_A_LENGTH > 0 || L1_DATA_B_LENGTH > 0 #if L1_DATA_A_LENGTH > 0 || L1_DATA_B_LENGTH > 0
dcplb_tbl[cpu][i_d].addr = get_l1_data_a_start_cpu(cpu); dcplb_tbl[cpu][i_d].addr = get_l1_data_a_start_cpu(cpu);
......
...@@ -56,6 +56,15 @@ void __init generate_cplb_tables_cpu(unsigned int cpu) ...@@ -56,6 +56,15 @@ void __init generate_cplb_tables_cpu(unsigned int cpu)
i_tbl[i_i++].data = SDRAM_IGENERIC | PAGE_SIZE_4MB; i_tbl[i_i++].data = SDRAM_IGENERIC | PAGE_SIZE_4MB;
} }
#ifdef CONFIG_ROMKERNEL
/* Cover kernel XIP flash area */
addr = CONFIG_ROM_BASE & ~(4 * 1024 * 1024 - 1);
d_tbl[i_d].addr = addr;
d_tbl[i_d++].data = SDRAM_DGENERIC | PAGE_SIZE_4MB;
i_tbl[i_i].addr = addr;
i_tbl[i_i++].data = SDRAM_IGENERIC | PAGE_SIZE_4MB;
#endif
/* Cover L1 memory. One 4M area for code and data each is enough. */ /* Cover L1 memory. One 4M area for code and data each is enough. */
if (cpu == 0) { if (cpu == 0) {
if (L1_DATA_A_LENGTH || L1_DATA_B_LENGTH) { if (L1_DATA_A_LENGTH || L1_DATA_B_LENGTH) {
......
...@@ -44,7 +44,7 @@ ENTRY(_ret_from_fork) ...@@ -44,7 +44,7 @@ ENTRY(_ret_from_fork)
sti r4; sti r4;
#endif /* CONFIG_IPIPE */ #endif /* CONFIG_IPIPE */
SP += -12; SP += -12;
call _schedule_tail; pseudo_long_call _schedule_tail, p5;
SP += 12; SP += 12;
r0 = [sp + PT_IPEND]; r0 = [sp + PT_IPEND];
cc = bittst(r0,1); cc = bittst(r0,1);
...@@ -79,7 +79,7 @@ ENTRY(_sys_vfork) ...@@ -79,7 +79,7 @@ ENTRY(_sys_vfork)
r0 += 24; r0 += 24;
[--sp] = rets; [--sp] = rets;
SP += -12; SP += -12;
call _bfin_vfork; pseudo_long_call _bfin_vfork, p2;
SP += 12; SP += 12;
rets = [sp++]; rets = [sp++];
rts; rts;
...@@ -90,7 +90,7 @@ ENTRY(_sys_clone) ...@@ -90,7 +90,7 @@ ENTRY(_sys_clone)
r0 += 24; r0 += 24;
[--sp] = rets; [--sp] = rets;
SP += -12; SP += -12;
call _bfin_clone; pseudo_long_call _bfin_clone, p2;
SP += 12; SP += 12;
rets = [sp++]; rets = [sp++];
rts; rts;
...@@ -101,7 +101,7 @@ ENTRY(_sys_rt_sigreturn) ...@@ -101,7 +101,7 @@ ENTRY(_sys_rt_sigreturn)
r0 += 24; r0 += 24;
[--sp] = rets; [--sp] = rets;
SP += -12; SP += -12;
call _do_rt_sigreturn; pseudo_long_call _do_rt_sigreturn, p2;
SP += 12; SP += 12;
rets = [sp++]; rets = [sp++];
rts; rts;
......
...@@ -220,6 +220,16 @@ void __init bfin_relocate_l1_mem(void) ...@@ -220,6 +220,16 @@ void __init bfin_relocate_l1_mem(void)
memcpy(_stext_l2, _l2_lma, l2_len); memcpy(_stext_l2, _l2_lma, l2_len);
} }
#ifdef CONFIG_ROMKERNEL
void __init bfin_relocate_xip_data(void)
{
early_shadow_stamp();
memcpy(_sdata, _data_lma, (unsigned long)_data_len - THREAD_SIZE + sizeof(struct thread_info));
memcpy(_sinitdata, _init_data_lma, (unsigned long)_init_data_len);
}
#endif
/* add_memory_region to memmap */ /* add_memory_region to memmap */
static void __init add_memory_region(unsigned long long start, static void __init add_memory_region(unsigned long long start,
unsigned long long size, int type) unsigned long long size, int type)
...@@ -504,7 +514,7 @@ static __init void memory_setup(void) ...@@ -504,7 +514,7 @@ static __init void memory_setup(void)
#endif #endif
unsigned long max_mem; unsigned long max_mem;
_rambase = (unsigned long)_stext; _rambase = CONFIG_BOOT_LOAD;
_ramstart = (unsigned long)_end; _ramstart = (unsigned long)_end;
if (DMA_UNCACHED_REGION > (_ramend - _ramstart)) { if (DMA_UNCACHED_REGION > (_ramend - _ramstart)) {
...@@ -1261,8 +1271,8 @@ static int show_cpuinfo(struct seq_file *m, void *v) ...@@ -1261,8 +1271,8 @@ static int show_cpuinfo(struct seq_file *m, void *v)
seq_printf(m, "board memory\t: %ld kB (0x%p -> 0x%p)\n", seq_printf(m, "board memory\t: %ld kB (0x%p -> 0x%p)\n",
physical_mem_end >> 10, (void *)0, (void *)physical_mem_end); physical_mem_end >> 10, (void *)0, (void *)physical_mem_end);
seq_printf(m, "kernel memory\t: %d kB (0x%p -> 0x%p)\n", seq_printf(m, "kernel memory\t: %d kB (0x%p -> 0x%p)\n",
((int)memory_end - (int)_stext) >> 10, ((int)memory_end - (int)_rambase) >> 10,
_stext, (void *)_rambase,
(void *)memory_end); (void *)memory_end);
seq_printf(m, "\n"); seq_printf(m, "\n");
......
...@@ -15,7 +15,12 @@ _jiffies = _jiffies_64; ...@@ -15,7 +15,12 @@ _jiffies = _jiffies_64;
SECTIONS SECTIONS
{ {
#ifdef CONFIG_RAMKERNEL
. = CONFIG_BOOT_LOAD; . = CONFIG_BOOT_LOAD;
#else
. = CONFIG_ROM_BASE;
#endif
/* Neither the text, ro_data or bss section need to be aligned /* Neither the text, ro_data or bss section need to be aligned
* So pack them back to back * So pack them back to back
*/ */
...@@ -31,6 +36,12 @@ SECTIONS ...@@ -31,6 +36,12 @@ SECTIONS
LOCK_TEXT LOCK_TEXT
IRQENTRY_TEXT IRQENTRY_TEXT
KPROBES_TEXT KPROBES_TEXT
#ifdef CONFIG_ROMKERNEL
__sinittext = .;
INIT_TEXT
__einittext = .;
EXIT_TEXT
#endif
*(.text.*) *(.text.*)
*(.fixup) *(.fixup)
...@@ -50,8 +61,14 @@ SECTIONS ...@@ -50,8 +61,14 @@ SECTIONS
/* Just in case the first read only is a 32-bit access */ /* Just in case the first read only is a 32-bit access */
RO_DATA(4) RO_DATA(4)
__rodata_end = .;
#ifdef CONFIG_ROMKERNEL
. = CONFIG_BOOT_LOAD;
.bss : AT(__rodata_end)
#else
.bss : .bss :
#endif
{ {
. = ALIGN(4); . = ALIGN(4);
___bss_start = .; ___bss_start = .;
...@@ -67,7 +84,11 @@ SECTIONS ...@@ -67,7 +84,11 @@ SECTIONS
___bss_stop = .; ___bss_stop = .;
} }
#if defined(CONFIG_ROMKERNEL)
.data : AT(LOADADDR(.bss) + SIZEOF(.bss))
#else
.data : .data :
#endif
{ {
__sdata = .; __sdata = .;
/* This gets done first, so the glob doesn't suck it in */ /* This gets done first, so the glob doesn't suck it in */
...@@ -94,6 +115,8 @@ SECTIONS ...@@ -94,6 +115,8 @@ SECTIONS
__edata = .; __edata = .;
} }
__data_lma = LOADADDR(.data);
__data_len = SIZEOF(.data);
/* The init section should be last, so when we free it, it goes into /* The init section should be last, so when we free it, it goes into
* the general memory pool, and (hopefully) will decrease fragmentation * the general memory pool, and (hopefully) will decrease fragmentation
...@@ -103,6 +126,7 @@ SECTIONS ...@@ -103,6 +126,7 @@ SECTIONS
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
___init_begin = .; ___init_begin = .;
#ifdef CONFIG_RAMKERNEL
INIT_TEXT_SECTION(PAGE_SIZE) INIT_TEXT_SECTION(PAGE_SIZE)
/* We have to discard exit text and such at runtime, not link time, to /* We have to discard exit text and such at runtime, not link time, to
...@@ -125,6 +149,35 @@ SECTIONS ...@@ -125,6 +149,35 @@ SECTIONS
} }
.text_l1 L1_CODE_START : AT(LOADADDR(.exit.data) + SIZEOF(.exit.data)) .text_l1 L1_CODE_START : AT(LOADADDR(.exit.data) + SIZEOF(.exit.data))
#else
.init.data : AT(__data_lma + __data_len)
{
__sinitdata = .;
INIT_DATA
INIT_SETUP(16)
INIT_CALLS
CON_INITCALL
SECURITY_INITCALL
INIT_RAM_FS
. = ALIGN(4);
___per_cpu_load = .;
___per_cpu_start = .;
*(.data.percpu.first)
*(.data.percpu.page_aligned)
*(.data.percpu)
*(.data.percpu.shared_aligned)
___per_cpu_end = .;
EXIT_DATA
__einitdata = .;
}
__init_data_lma = LOADADDR(.init.data);
__init_data_len = SIZEOF(.init.data);
__init_data_end = .;
.text_l1 L1_CODE_START : AT(__init_data_lma + __init_data_len)
#endif
{ {
. = ALIGN(4); . = ALIGN(4);
__stext_l1 = .; __stext_l1 = .;
...@@ -205,7 +258,11 @@ SECTIONS ...@@ -205,7 +258,11 @@ SECTIONS
/* Force trailing alignment of our init section so that when we /* Force trailing alignment of our init section so that when we
* free our init memory, we don't leave behind a partial page. * free our init memory, we don't leave behind a partial page.
*/ */
#ifdef CONFIG_RAMKERNEL
. = __l2_lma + __l2_len; . = __l2_lma + __l2_len;
#else
. = __init_data_end;
#endif
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
___init_end = .; ___init_end = .;
......
...@@ -405,7 +405,7 @@ ENTRY(_double_fault) ...@@ -405,7 +405,7 @@ ENTRY(_double_fault)
r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */ r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */
SP += -12; SP += -12;
call _double_fault_c; pseudo_long_call _double_fault_c, p5;
SP += 12; SP += 12;
.L_double_fault_panic: .L_double_fault_panic:
JUMP .L_double_fault_panic JUMP .L_double_fault_panic
...@@ -447,7 +447,7 @@ ENTRY(_exception_to_level5) ...@@ -447,7 +447,7 @@ ENTRY(_exception_to_level5)
r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */ r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */
SP += -12; SP += -12;
call _trap_c; pseudo_long_call _trap_c, p4;
SP += 12; SP += 12;
/* If interrupts were off during the exception (IPEND[4] = 1), turn them off /* If interrupts were off during the exception (IPEND[4] = 1), turn them off
...@@ -551,7 +551,7 @@ ENTRY(_kernel_execve) ...@@ -551,7 +551,7 @@ ENTRY(_kernel_execve)
p0 = sp; p0 = sp;
sp += -16; sp += -16;
[sp + 12] = p0; [sp + 12] = p0;
call _do_execve; pseudo_long_call _do_execve, p5;
SP += 16; SP += 16;
cc = r0 == 0; cc = r0 == 0;
if ! cc jump .Lexecve_failed; if ! cc jump .Lexecve_failed;
...@@ -704,7 +704,7 @@ ENTRY(_system_call) ...@@ -704,7 +704,7 @@ ENTRY(_system_call)
sp += 4; sp += 4;
SP += -12; SP += -12;
call _schedule; pseudo_long_call _schedule, p4;
SP += 12; SP += 12;
jump .Lresume_userspace_1; jump .Lresume_userspace_1;
...@@ -723,7 +723,7 @@ ENTRY(_system_call) ...@@ -723,7 +723,7 @@ ENTRY(_system_call)
r0 = sp; r0 = sp;
SP += -12; SP += -12;
call _do_notify_resume; pseudo_long_call _do_notify_resume, p5;
SP += 12; SP += 12;
.Lsyscall_really_exit: .Lsyscall_really_exit:
...@@ -736,7 +736,7 @@ ENDPROC(_system_call) ...@@ -736,7 +736,7 @@ ENDPROC(_system_call)
* this symbol need not be global anyways, so ... * this symbol need not be global anyways, so ...
*/ */
_sys_trace: _sys_trace:
call _syscall_trace; pseudo_long_call _syscall_trace, p5;
/* Execute the appropriate system call */ /* Execute the appropriate system call */
...@@ -760,7 +760,7 @@ _sys_trace: ...@@ -760,7 +760,7 @@ _sys_trace:
SP += 24; SP += 24;
[sp + PT_R0] = r0; [sp + PT_R0] = r0;
call _syscall_trace; pseudo_long_call _syscall_trace, p5;
jump .Lresume_userspace; jump .Lresume_userspace;
ENDPROC(_sys_trace) ENDPROC(_sys_trace)
...@@ -1007,7 +1007,8 @@ ENTRY(_schedule_and_signal_from_int) ...@@ -1007,7 +1007,8 @@ ENTRY(_schedule_and_signal_from_int)
r0 = sp; r0 = sp;
sp += -12; sp += -12;
call _finish_atomic_sections;
pseudo_long_call _finish_atomic_sections, p5;
sp += 12; sp += 12;
jump.s .Lresume_userspace; jump.s .Lresume_userspace;
ENDPROC(_schedule_and_signal_from_int) ENDPROC(_schedule_and_signal_from_int)
......
...@@ -186,6 +186,11 @@ ENTRY(__start) ...@@ -186,6 +186,11 @@ ENTRY(__start)
/* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
call _bfin_relocate_l1_mem; call _bfin_relocate_l1_mem;
#ifdef CONFIG_ROMKERNEL
call _bfin_relocate_xip_data;
#endif
#ifdef CONFIG_BFIN_KERNEL_CLOCK #ifdef CONFIG_BFIN_KERNEL_CLOCK
/* Only use on-chip scratch space for stack when absolutely required /* Only use on-chip scratch space for stack when absolutely required
* to avoid Anomaly 05000227 ... we know the init_clocks() func only * to avoid Anomaly 05000227 ... we know the init_clocks() func only
......
...@@ -109,10 +109,10 @@ __common_int_entry: ...@@ -109,10 +109,10 @@ __common_int_entry:
cc = r0 == 0; cc = r0 == 0;
if cc jump .Lcommon_restore_context; if cc jump .Lcommon_restore_context;
#else /* CONFIG_IPIPE */ #else /* CONFIG_IPIPE */
call _do_irq; pseudo_long_call _do_irq, p2;
SP += 12; SP += 12;
#endif /* CONFIG_IPIPE */ #endif /* CONFIG_IPIPE */
call _return_from_int; pseudo_long_call _return_from_int, p2;
.Lcommon_restore_context: .Lcommon_restore_context:
RESTORE_CONTEXT RESTORE_CONTEXT
rti; rti;
...@@ -168,7 +168,7 @@ ENTRY(_evt_ivhw) ...@@ -168,7 +168,7 @@ ENTRY(_evt_ivhw)
r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */ r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */
SP += -12; SP += -12;
call _trap_c; pseudo_long_call _trap_c, p5;
SP += 12; SP += 12;
#ifdef EBIU_ERRMST #ifdef EBIU_ERRMST
...@@ -179,7 +179,7 @@ ENTRY(_evt_ivhw) ...@@ -179,7 +179,7 @@ ENTRY(_evt_ivhw)
w[p0] = r0.l; w[p0] = r0.l;
#endif #endif
call _ret_from_exception; pseudo_long_call _ret_from_exception, p2;
.Lcommon_restore_all_sys: .Lcommon_restore_all_sys:
RESTORE_ALL_SYS RESTORE_ALL_SYS
...@@ -223,7 +223,7 @@ ENTRY(_evt_system_call) ...@@ -223,7 +223,7 @@ ENTRY(_evt_system_call)
#ifdef CONFIG_FRAME_POINTER #ifdef CONFIG_FRAME_POINTER
fp = 0; fp = 0;
#endif #endif
call _system_call; pseudo_long_call _system_call, p2;
jump .Lcommon_restore_context; jump .Lcommon_restore_context;
ENDPROC(_evt_system_call) ENDPROC(_evt_system_call)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment