From mboxrd@z Thu Jan 1 00:00:00 1970 From: Scott McNutt Date: Thu, 19 Aug 2010 22:25:07 -0400 Subject: [U-Boot] [PATCH v2] nios2: fix out of reach case for do_reset In-Reply-To: <1281926984-11411-1-git-send-email-thomas@wytron.com.tw> References: <4C65DA8F.5000301@heeltoe.com> <1281926984-11411-1-git-send-email-thomas@wytron.com.tw> Message-ID: <4C6DE783.1040203@psyent.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Thomas, Applied to: git://git.denx.de/u-boot-nios.git next Thanks, --Scott Thomas Chou wrote: > There is a limitation (or bug?) of nios2 toolchain. The nios2 gcc > didn't generate correct code when the reset vector is passed as a > constant. It just generated a direct "call", which was wrong when > the reset vector was not located in the same 256MB span as u-boot. > > The "Nios II Processor Reference Handbook" said, > "call can transfer execution anywhere within the 256 MByte range > determined by PC31..28. The Nios II GNU linker does not automatically > handle cases in which the address is out of this range." > > So we have to use registered "callr" instruction to do the job. > > Signed-off-by: Thomas Chou > --- > v2, add a macro for the inlince asm nios2_callr. > > arch/nios2/cpu/cpu.c | 11 +++++------ > arch/nios2/include/asm/system.h | 5 +++++ > 2 files changed, 10 insertions(+), 6 deletions(-) > > diff --git a/arch/nios2/cpu/cpu.c b/arch/nios2/cpu/cpu.c > index 6379534..d9c6544 100644 > --- a/arch/nios2/cpu/cpu.c > +++ b/arch/nios2/cpu/cpu.c > @@ -40,11 +40,10 @@ int checkcpu (void) > return (0); > } > > - > -int do_reset (void) > +int do_reset(void) > { > - void (*rst)(void) = (void(*)(void))CONFIG_SYS_RESET_ADDR; > - disable_interrupts (); > - rst(); > - return(0); > + disable_interrupts(); > + /* indirect call to go beyond 256MB limitation of toolchain */ > + nios2_callr(CONFIG_SYS_RESET_ADDR); > + return 0; > } > diff --git a/arch/nios2/include/asm/system.h b/arch/nios2/include/asm/system.h > index bb03ca5..086d92b 100644 > --- a/arch/nios2/include/asm/system.h > +++ b/arch/nios2/include/asm/system.h > @@ -56,4 +56,9 @@ > ((flags & NIOS2_STATUS_PIE_MSK) == 0x0); \ > }) > > +/* indirect call to go beyond 256MB limitation of toolchain */ > +#define nios2_callr(addr) __asm__ __volatile__ ( \ > + "callr %0" \ > + : : "r" (addr)) > + > #endif /* __ASM_NIOS2_SYSTEM_H */