linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* How to debug MMU on powerpc?
@ 2000-06-30  7:55 Gong Zhuo
  2000-06-30 15:29 ` Tom Roberts
  0 siblings, 1 reply; 3+ messages in thread
From: Gong Zhuo @ 2000-06-30  7:55 UTC (permalink / raw)
  To: Linux PPC Mailing List


Hi:
  I am using MVME2600 and debug my program through serial port. I must use
MMU for some reasons and the virtual address and physical address is not
consistent. That means virtual address 0 maybe physical address 0xc000. I
have used BAT method. All the mapping is finished in assembly language and I
have make the cross-compile , gdb for powerpc-eabi. But how can I link and
debug my program?
  1. If I link my program with virtual address , the code before the mmu is
opened will be linked with the virtual address but they should run in the
physical address.
  2. The powerpc-eabi-gdb will load my program to the entry-point of virtual
address, but the mmu has not been opened at that time.
  ...


Gong Zhuo


** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: How to debug MMU on powerpc?
  2000-06-30  7:55 How to debug MMU on powerpc? Gong Zhuo
@ 2000-06-30 15:29 ` Tom Roberts
  2000-07-01  3:05   ` Gong Zhuo
  0 siblings, 1 reply; 3+ messages in thread
From: Tom Roberts @ 2000-06-30 15:29 UTC (permalink / raw)
  To: Gong Zhuo; +Cc: Linux PPC Mailing List


Gong Zhuo wrote:
>   I am using MVME2600 and debug my program through serial port. I must use
> MMU for some reasons and the virtual address and physical address is not
> consistent. That means virtual address 0 maybe physical address 0xc000. I
> have used BAT method. All the mapping is finished in assembly language and I
> have make the cross-compile , gdb for powerpc-eabi. But how can I link and
> debug my program?

>From your descriptiojn your program is not running under Linux, but is
a stand-alone program. If this is not true and you intend to run it
under Linux, then you must let Linux manage the MMU.

A stand-alone program which is using the MMU must be carefully designed
so that the MMU can be initialized and then enabled properly. There are
two basic ways to do this:
 A) arrange so the startup code will be mapped virtual=physical, so it
    can start with MMU disabled, setup the BATs (and segments if any),
    and then enable the MMU. Since this code is mapped virtual=physical
    it continues to run after the MMU is enabled.
 B) arrange so the startup code runs with MMU disabled, setup the BATs
    (and segments if any) and then:
	mtspr SRR1,<desired MSR value with MMU enabled>
	mtspr SRR0,<virtual address to start at>
	rfi
    Note that the fact that branches are generally PC-relative makes
    this a lot easier -- you may not need to do anything at all to
    make it work correctly (initialize the BATs with load immediates,
    not data accesses). Note also that if the code starts with the
    MMU enabled you must use much care in modifying the BATs.
Our proprietary OS uses mthod A (the entire kernel runs
virtual=physical, only user programs have non-physical virtual
addresses); Linux's head.S uses method B.


>   1. If I link my program with virtual address , the code before the mmu is
> opened will be linked with the virtual address but they should run in the
> physical address.

Sure, but as branches and calls are PC-relative, it may still work.
You need to be careful about data accesses, however. As you are using
BATs, there is a simple subtraction/addition to relate virtual and
physical addresses, and you can explicitly do that for data accesses.
Look at Linux's head.S (in directory arch/ppc/kernel) for examples of
this during startup; the value to be subtracted for virt->phys is
called KERNELBASE (but in the mm code is called PAGE_OFFSET (:-().


>   2. The powerpc-eabi-gdb will load my program to the entry-point of virtual
> address, but the mmu has not been opened at that time.

See above. It depends in detail how your loading of the program arranges
to jump to its starting point. Note that most boot ROMs and debug ROMS
do not use the MMU and will load the program where you tell it and
simply jump to its first location or a physical address you tell it.
You must take the behavior of your boot/debug ROM into account when
designing the startup of your program.

Hmmm. Your paragraph here sort-of implies that you intend to startup
Linux, run gdb, and have gdb load and execute your program which
will then take over the MMU (etc.). This is unlikely to work,
because the execution environment for gdb and the Linux kernel will
be completely destroyed. I repeat: if you intend to run this program
under Linux then you must let Linux manage the MMU.

	Note: the version of PPC Linux I have (2.2.15) uses only
	DBAT2,DBAT3,IBAT2,IBAT3, so the other BATs are available
	for system-specific uses. My custom drivers use DBAT0 and
	DBAT1. Before doing this you must make sure that the
	system-level code for your board does not already use
	these BATs (write a module to dump the BATs, or inspect
	the Linux startup code VERY carefully). This may be what
	you are looking for.


Tom Roberts	tjroberts@lucnet.com

** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: How to debug MMU on powerpc?
  2000-06-30 15:29 ` Tom Roberts
@ 2000-07-01  3:05   ` Gong Zhuo
  0 siblings, 0 replies; 3+ messages in thread
From: Gong Zhuo @ 2000-07-01  3:05 UTC (permalink / raw)
  To: Tom Roberts; +Cc: Linux PPC Mailing List


>> Gong Zhuo wrote:
> >   I am using MVME2600 and debug my program through serial port. I must
use
> > MMU for some reasons and the virtual address and physical address is not
> > consistent. That means virtual address 0 maybe physical address 0xc000.
I
> > have used BAT method. All the mapping is finished in assembly language
and I
> > have make the cross-compile , gdb for powerpc-eabi. But how can I link
and
> > debug my program?
>
> From your descriptiojn your program is not running under Linux, but is
> a stand-alone program. If this is not true and you intend to run it
> under Linux, then you must let Linux manage the MMU.
>
> A stand-alone program which is using the MMU must be carefully designed
> so that the MMU can be initialized and then enabled properly. There are
> two basic ways to do this:
>  A) arrange so the startup code will be mapped virtual=physical, so it
>     can start with MMU disabled, setup the BATs (and segments if any),
>     and then enable the MMU. Since this code is mapped virtual=physical
>     it continues to run after the MMU is enabled.
>  B) arrange so the startup code runs with MMU disabled, setup the BATs
>     (and segments if any) and then:
> mtspr SRR1,<desired MSR value with MMU enabled>
> mtspr SRR0,<virtual address to start at>
> rfi
>     Note that the fact that branches are generally PC-relative makes
>     this a lot easier -- you may not need to do anything at all to
>     make it work correctly (initialize the BATs with load immediates,
>     not data accesses). Note also that if the code starts with the
>     MMU enabled you must use much care in modifying the BATs.
> Our proprietary OS uses mthod A (the entire kernel runs
> virtual=physical, only user programs have non-physical virtual
> addresses); Linux's head.S uses method B.
>
>
> >   1. If I link my program with virtual address , the code before the mmu
is
> > opened will be linked with the virtual address but they should run in
the
> > physical address.
>
> Sure, but as branches and calls are PC-relative, it may still work.
> You need to be careful about data accesses, however. As you are using
> BATs, there is a simple subtraction/addition to relate virtual and
> physical addresses, and you can explicitly do that for data accesses.
> Look at Linux's head.S (in directory arch/ppc/kernel) for examples of
> this during startup; the value to be subtracted for virt->phys is
> called KERNELBASE (but in the mm code is called PAGE_OFFSET (:-().
>
>
> >   2. The powerpc-eabi-gdb will load my program to the entry-point of
virtual
> > address, but the mmu has not been opened at that time.
>
> See above. It depends in detail how your loading of the program arranges
> to jump to its starting point. Note that most boot ROMs and debug ROMS
> do not use the MMU and will load the program where you tell it and
> simply jump to its first location or a physical address you tell it.
> You must take the behavior of your boot/debug ROM into account when
> designing the startup of your program.
>
> Hmmm. Your paragraph here sort-of implies that you intend to startup
> Linux, run gdb, and have gdb load and execute your program which
> will then take over the MMU (etc.). This is unlikely to work,
> because the execution environment for gdb and the Linux kernel will
> be completely destroyed. I repeat: if you intend to run this program
> under Linux then you must let Linux manage the MMU.
>
> Note: the version of PPC Linux I have (2.2.15) uses only
> DBAT2,DBAT3,IBAT2,IBAT3, so the other BATs are available
> for system-specific uses. My custom drivers use DBAT0 and
> DBAT1. Before doing this you must make sure that the
> system-level code for your board does not already use
> these BATs (write a module to dump the BATs, or inspect
> the Linux startup code VERY carefully). This may be what
> you are looking for.

Thank you very much for your help . I have another question. In fact , I am
developing a stand-alone program and the virtual address is not the same as
physical address. The mothed B has been used . I use the cross-compile of
gcc for powerpc-eabi and want to use the psim (powerpc simulator) to debug
my program . If the virtual=phiscal , everything will be ok. But the virtual
!= physical , can the psim still be used? If it can , how to compile my
program and load it into the psim?


** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2000-07-01  3:05 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2000-06-30  7:55 How to debug MMU on powerpc? Gong Zhuo
2000-06-30 15:29 ` Tom Roberts
2000-07-01  3:05   ` Gong Zhuo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).