On Tue, Dec 20, 2011 at 9:00 AM, Julius Baxter <[email protected]>wrote:

> On Mon, Dec 19, 2011 at 8:43 PM, Matthew Hicks <[email protected]>
> wrote:
> > Below is a patch the redefines the macro used for clearing general
> purpose
> > registers from l.or to l.movhi.  Using l.or relies on other possible
> > uninitialized registers while l.movhi just relies on a 0 immediate value.
> >  This is important in RTL simulations and environments where the memory
> used
> > for the reg file is NOT guaranteed to be reset to zero.  I have also
> added a
> > line which resets r0 since before its first use since it is possible
> that r0
> > may not contain the value 0, but software expects it to be 0.
> >
> > diff --git a/arch/openrisc/kernel/head.S b/arch/openrisc/kernel/head.S
> > index 1088b5f..1fa6b1d 100644
> > --- a/arch/openrisc/kernel/head.S
> > +++ b/arch/openrisc/kernel/head.S
> > @@ -33,7 +33,7 @@
> >   l.add rd,rd,rs
> >
> >  #define CLEAR_GPR(gpr) \
> > - l.or    gpr,r0,r0
> > + l.movhi    gpr,0
>
> I reckon this is a good move.
>
> >
> >  #define LOAD_SYMBOL_2_GPR(gpr,symbol) \
> >   l.movhi gpr,hi(symbol) ;\
> > @@ -441,6 +441,9 @@ _dispatch_do_ipage_fault:
> >   __HEAD
> >   .global _start
> >  _start:
> > +    /* Ensure that r0 really is 0 */
> > +    CLEAR_GPR(r0)
> > +
>
> Shouldn't this be the first instruction of the reset vector instead of
> _start()?
>

I checked, and the few instructions executed before execution enters _start
do not rely on any register having a specific value (e.g., r0 does not need
to be zero).


---Matthew Hicks
_______________________________________________
OpenRISC mailing list
[email protected]
http://lists.openrisc.net/listinfo/openrisc

Reply via email to