; --------------------------------------------------------------------------------
; @Title: Linux Demo for TRACE32 OS Awareness
; @Description:
;
;   This batchfile demonstrates the use of the OS Awareness for Linux
;
;   The example is generated for an IBM Walnut 405GP board using an ICD.
;   It will NOT run on any other board, but may be used as a template
;   for others.
;
;   Linux will be downloaded either via Boot Monitor using BOOTP, or via ICD.
;   start with "do linux bootp" for BOOTP loading,
;   start with "do linux icd"   for ICD loading (default).
;
; @Keywords: awareness, linux, RTOS, walnut
; @Author: DIE
; @Board: IBM-Walnut-405GP
; @Chip: PPC405GP
; @Copyright: (C) 1989-2015 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: linux.cmm 13987 2019-02-19 16:15:20Z kjmal $


; Connect BDM cable to J24 (not to trace preprocessor!)
; Connect trace cable to J20

; IMPORTANT NOTE !!!
; You may have to set CONFIG_BDI_SWITCH to prevent the kernel
; from modifying the debug registers.

; Starting Linux example with TRACE32 and Hyperterminal:
; - Connect NULL modem cable to J11/RS232-1 (lower jack)
; - Start TRACE32
; - Open Hyperterminal: 9600 baud, 8/N/1, no(!) handshake
; - (T32) do linux
; - if bootp loading: (HT)  0
; - (HT) login as root and start "helloloop"


 ENTRY &loadmode
 IF "&loadmode"==""
   &loadmode="icd"
 IF "&loadmode"=="BOOTP"
   &loadmode="bootp"

 LOCAL &ka_path &awareness
 LOCAL &srcdrive
 LOCAL &srcpath
 &srcdrive="S:"
 &srcpath="&srcdrive"+"\"


 SCREEN.ON


; Debugger Reset

 WinPAGE.RESet
 AREA.RESet
 WinPOS 0. 24. 70. 9. 0. 0. W000
 AREA.view

 PRINT "resetting..."

 SYStem.Down
 TASK.RESet
 Break.RESet
 MAP.RESet
 sYmbol.RESet
 TRANSlation.RESet
 GROUP.RESet


; Initializing Debugger

 PRINT "initializing..."
 SYStem.CPU PPC405GP
 SYStem.Option MMUSPACES ON     ; enable space ids to virtual addresses
 SYStem.Up
 Register.RESet
 SETUP.IMASKASM ON              ; lock interrupts while single stepping


; Initialize flow trace hardware, if available
 IF Analyzer.MODE.FLOW()
 (
   SYStem.Option DataTrace ON ; enable data trace for 440 (needs patching!)
   Trace.TERMination ON       ; configure trace preprocessor
   Trace.THreshold 0.81
   SYStem.BdmClock 10.0MHz
 )


; Target Setup: initialize board memory access and peripherals
 PRINT "target setup..."

 IF "&loadmode"=="bootp"
 (
   ; if you want to load the image via BOOTP (much faster):

   ; we wait for an input in the terminal until startup starts

   PRINT "please enter '0' in the terminal window..."
 )
 ELSE
 (
   ; if you want to load the image via ICD

   ; let the boot monitor setup the board
   Go.direct
   WAIT 3.s
   Break.direct

   ; Flush the caches before downloading Linux!
   CACHE.FLUSH DC
   CACHE.FLUSH IC

   ; Set peripherals to CPU Trace for flow trace capability
   Data.Set DCR:0xB1 Data.Long(dcr:0xB1)|0x08000000

   ; Use the next lines (loading linux image, setting
   ; registers and board info structure) only when
   ; loading the kernel into RAM using the debugger.

   ; vmlinux starts physically at RAM start.
   ; We have to adjust it from the virtual start address
   ; to the physical start address
   ; i.e.: Data.LOAD.Elf vmlinux <physical start>-<virtual start>

   PRINT "loading Linux kernel..."
   Data.LOAD.Elf vmlinux 0x0-0xc0000000 /gnu /NosYmbol

   Register.RESet

   ; set PC on start address of image
   Register.Set IP 0

   ; Fill in board info (bd_t structure) for linux boot
   DO board_info

   ; Load initial ram disk (initrd)

   ; Use the next lines only, if you want to use an initrd,
   ; and if you want to download this with the debugger.

   ; Load ram file system image into ram disk
   ; The load address is either hardcoded in arch/arm/<board>/arch.c,
   ; or must be passed by a boot parameter, or as command line option

   PRINT "loading ramdisk..."
   Data.LOAD.Binary ramdisk.image.gz 0x0300000 /NoClear /NosYmbol

   Register.Set R4 0x0300000     ; R4 points to initrd
   Register.Set R5 0x0480000     ; R5 points to end of initrd
 )


; Load the Linux kernel symbols into the debugger
  ; /strippart and /path are used to map source paths

 PRINT "loading Linux kernel symbols..."
 Data.LOAD.Elf vmlinux /gnu /NoCODE /StripPART 3 /PATH "&srcpath"
 sYmbol.CLEANUP.sYmbols


; Open a Code Window -- we like to see something

 WinPOS 0. 0. 75. 20.
 List.auto
 SCREEN.display


; Go until MMU initialization

 Go.direct MMU_init /Onchip
 PRINT "initializing target MMU..."
 WAIT !run()


; Declare the MMU format to the debugger
 ; - table format is "LINUX"
 ; - table base address is at label "swapper_pg_dir"
 ; - kernel address translation
 ; Map the virtual kernel symbols to physical addresses to give
 ; the debugger access to it before CPU MMU is initialized

 PRINT "initializing debugger MMU..."
 MMU.FORMAT LINUX swapper_pg_dir 0xc0000000--0xc1ffffff 0x00000000
 TRANSlation.COMMON 0xc0000000--0xffffffff              ; common area for kernel and processes
 TRANSlation.TableWalk ON   ; debugger uses a table walk to decode virtual addresses
 TRANSlation.ON             ; switch on debugger(!) address translation


; Initialize Linux Support

 ; Note that the Linux awareness needs the kernel symbols to work

 ; check linux major version
 IF STRing.SCAN(Data.STRing(linux_banner), "Linux version 2.", 0)==0
 (
     &ka_path="~~/demo/powerpc/kernel/linux/linux-2.x"
     &awareness="linux.t32"
 )
 ELSE
 (
     &ka_path="~~/demo/powerpc/kernel/linux/linux-3.x"
     &awareness="linux3.t32"
 )

 PRINT "initializing RTOS support..."
 TASK.CONFIG &ka_path/&awareness       	; loads Linux awareness
 MENU.ReProgram &ka_path/linux    	; loads Linux menu

 GROUP.Create "kernel" 0xc0000000--0xffffffff /RED


; Ok, we're done, let's start Linux

 Go.direct
 PRINT "starting Linux... (please wait)"
 WAIT 5.s
 Break.direct

 PRINT "done."      ; done with loading and starting Linux


; --------------------------------------------------------------------------------
;       Application Debugging
;           e.g. "hello"
; --------------------------------------------------------------------------------

 ; activate autoloader for processes:
 TASK.sYmbol.Option AutoLoad Process

 PRINT "please log in and start 'hello'"

 ; script based
   ; using the script based application debugging
   ; gives more control over the single commands
   ; see file "app_debug.cmm"

   ;LOCAL &extdir
   ;&extdir=TASK.GETDIR()
   ;DO &extdir/app_debug hello

 ; process watch system
   ; the process watch system automates the actions
   ; for application debugging

   WinPOS 55. 25. 40. 4.
   TASK.Watch.View "hello"

   Go.direct

 ENDDO
