[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [openrisc] Function prologue and stack frame



Hi Carlos,

Right now I can't exactly remember the reasons for the changes that we
did (it was quite a while ago), but I would suggest that we stay with
the prologue that GCC produces. This means that it is necessary to
change the GDB and documentation. Your remarks will be useful in doing
that, but I don't know, when this will be finished. Maybe there are
people, that are willing to help, so work will be done faster.

Regards
Simon

Carlos Sánchez de La Lama wrote:
> 
> Hallo everybody. I'm sorry for my late answer, but anyway here it is.
> 
> > > It seems to me that there are some inconsistences between the prologue
> > > that GCC introduces and what GDB expects to find at the beginning of
> > > functions. I've looked at source code, and or32_output_file (in GCC
> > > sources, or32.c) and or1k_skip_prologue (GDB sources, or1k-tdep.c) simply
> > > don't match. Moreover, the prologue format expected by the mentioned
> > > or1k_skip_prologue and by or1k_frame_chain (also from GDB sources) is not
> > > the same.
> >
> > Yes, function prologues/epilogues were changed many times, since the
> > original (in the manual) had problems. Note that specifications for this
> > are very strict, and can cause lot of problems with OS development. As it
> > did in our case ;)
> > And I was doing gdb somewhere in the middle ;)
> >
> > Can you please post the differences, so we can choose the prologue we are
> > happy with. I know Simon did a most of work on this when he was doing
> > uClinux port.
> 
> The prologue introduced by GCC is as follows:
> 
>         l.movhi r11, hi(stack_size)             |
>         l.ori           r11, r11, lo(stack_size)        | this if stack_size >= 0x8000
>         l.sub           r1, r1, r11                             |
>                         or
>         l.addi  r1, r1, -stack_size             | this if 0 < stack_size < 0x8000
> 
>         l.sw            I(r1), r2                               | here I reserves space for             |
>                                                                 | outgoing args and link register       |
>                                                                 | save                                          | if needed
>                                                                                                                         | to save
>         l.add           r2, r1, r11                             | stack_size  >= 0x8000                 | frame pointer
>                         or                                                                                              |
>         l.addi  r2, r1, stack_size              | 0 <= stack_size <= 0x8000             |
> 
>         l.sw            I(r1), r9                               | I reserves space for                  | if saving
>                                                                 | outgoing args only                            | link register
> 
>         l.sw            I(r1), rx                               | As needed to save
>                                                                 | registers used in function
> 
> While the prologue expected in or1k_skip_proloque is completely different (see
> or1k-tdep.c in GDB sources). Strangely, or1k_frame_chain DOES expect the
> format intoduced by GCC (???).
> 
> > > On the other hand, the stack frame format depicted on the OpenRISC
> > > Architecture Manual is different to the one created by the code actually
> > > inserted by GCC. The latter puts local variables just below FP, and
> > > previous FP and return address below those.
> 
> The prologue shown above creates a stack frame like this:
> 
> FP ------>      ------------------------
>                 Function variables
>                 ------------------------
> SP+4 --->       Previous FP
> SP------->      Return address
> 
> that doesn't match with the one shown on the ABI chapter of the Architecture
> Manual. So when I say that or1k_frame_chain expects the prologue actually
> introduced by GDB y meant that expects the frame format created by that
> prologue.
> 
> I hope my explanations are clear enough. It's not easy to draw such memory
> diagrams using ASCII :-(
> 
> Best regards,
> 
>         Carlos
> --
> To unsubscribe from openrisc mailing list please visit http://www.opencores.org/mailinglists.shtml
--
To unsubscribe from openrisc mailing list please visit http://www.opencores.org/mailinglists.shtml