407 lines
9.9 KiB
Plaintext
407 lines
9.9 KiB
Plaintext
; --------------------------------------------------------------------------------
|
|
; @Title: L4Re specific menu
|
|
; @Description: -
|
|
; @Keywords: fiasco l4re menu awareness hypervisor
|
|
; @Author: AME
|
|
; @Copyright: (c) 1989-2024 Lauterbach GmbH, licensed for use with TRACE32(R) only
|
|
; --------------------------------------------------------------------------------
|
|
; $Id: fiasco.m 9987 2024-03-21 13:44:34Z amerkle $
|
|
|
|
IF PRACTICE.CoMmanD.AVAILable(TASK.ListObj)
|
|
(
|
|
NAME "TASK.L4RE"
|
|
IF !MENU.EXIST("TASK.L4RE")
|
|
(
|
|
add
|
|
menu
|
|
(
|
|
popup "L4Re"
|
|
(
|
|
MENUITEM "Display &Objects"
|
|
(
|
|
TASK.ListObj
|
|
)
|
|
default
|
|
MENUITEM "Display &Threads"
|
|
(
|
|
TASK.ListThr
|
|
)
|
|
MENUITEM "Display &Tasks"
|
|
(
|
|
TASK.ListTASK
|
|
)
|
|
SEPARATOR
|
|
MENUITEM "Display Task Tree" "TASK.List.TREE"
|
|
MENUITEM "Display Core Activity" "CORE.List"
|
|
)
|
|
//popup "&Help"
|
|
//(
|
|
// MENUITEM "[:manual]OS Awareness Manual Fiasco" "HELP __RTOS_FIASCO_"
|
|
//)
|
|
)
|
|
|
|
|
|
menu "task.lt"
|
|
(
|
|
default
|
|
//menuitem "Display detailed"
|
|
//(
|
|
// &address=address.offset(track.address())
|
|
// TASK.ListThread &address
|
|
//)
|
|
menuitem "Display thread object"
|
|
(
|
|
PRIVATE &pAddress &nAddress &nMask
|
|
&pAddress=TRACK.ADDRESS()
|
|
&nAddress=ADDRESS.OFFSET(&pAddress)
|
|
&nMask=TASK.MASKOF("threadtocontext")
|
|
&pAddress=&pAddress-&nAddress+(&nAddress&(&nMask))
|
|
Var.View %Open %String (Thread*)(&pAddress)
|
|
)
|
|
menuitem "Display context object"
|
|
(
|
|
PRIVATE &pAddress &nAddress &nMask
|
|
&pAddress=TRACK.ADDRESS()
|
|
&nAddress=ADDRESS.OFFSET(&pAddress)
|
|
&nMask=TASK.MASKOF("threadtocontext")
|
|
&pAddress=&pAddress-&nAddress+(&nAddress&(&nMask))
|
|
Var.View %Open %String (Context*)(&pAddress)
|
|
)
|
|
menuitem "Display thread context"
|
|
(
|
|
PRIVATE &pAddress &nAddress &sExpr &sExprEx
|
|
&pAddress=TRACK.ADDRESS()
|
|
&nAddress=ADDRESS.OFFSET(&pAddress)
|
|
&sExpr=TASK.TASKCTX(&nAddress)
|
|
&sExprEx=TASK.VCPUCTX(&nAddress)
|
|
Var.View %Open %String %Hex &sExpr &sExprEx
|
|
)
|
|
separator
|
|
menuitem "Dump thread entry"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()
|
|
Data.dump &pAddress /Long /DIALOG
|
|
)
|
|
)
|
|
|
|
|
|
menu "task.lo"
|
|
(
|
|
default
|
|
//menuitem "Display detailed"
|
|
//(
|
|
// &address=address.offset(track.address())
|
|
// TASK.ListObj &address
|
|
//)
|
|
menuitem "Display kernel object"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()
|
|
Var.View %M %String (Kobject*)(&pAddress)
|
|
)
|
|
separator
|
|
menuitem "Dump object entry"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()
|
|
Data.dump &pAddress /Long /DIALOG
|
|
)
|
|
)
|
|
|
|
|
|
menu "task.ltask"
|
|
(
|
|
default
|
|
menuitem "[:objects]Display detailed"
|
|
(
|
|
PRIVATE &nAddress
|
|
&nAddress=ADDRESS.OFFSET(TRACK.ADDRESS())
|
|
TASK.ListTASK &nAddress
|
|
)
|
|
separator
|
|
menuitem "[:var]Display Task object"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()
|
|
Var.View %Open %String (Task*)(&pAddress)
|
|
)
|
|
menuitem "[:var]Display Kobject object"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()
|
|
Var.View %Open %String (Kobject*)(&pAddress)
|
|
)
|
|
menuitem "[:var]Display Space object"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()+TASK.OFFSETOF(Task.Space)
|
|
Var.View %Open %String (Space*)(&pAddress)
|
|
)
|
|
menuitem "[:var]Display Mem_space object"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()+TASK.OFFSETOF(Task.Space)
|
|
Var.View %Open %String (Mem_space*)(&pAddress)
|
|
)
|
|
separator
|
|
menuitem "[:dump]Dump object entry"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()
|
|
Data.dump &pAddress /Long /DIALOG
|
|
)
|
|
)
|
|
)
|
|
)
|
|
ELSE
|
|
(
|
|
NAME "EXT.L4RE"
|
|
IF !MENU.EXIST("EXT.L4RE")
|
|
(
|
|
add
|
|
menu
|
|
(
|
|
popup "L4Re"
|
|
(
|
|
MENUITEM "Display &Objects"
|
|
(
|
|
EXTension.ListObj
|
|
)
|
|
default
|
|
MENUITEM "Display &Threads"
|
|
(
|
|
EXTension.ListThr
|
|
)
|
|
MENUITEM "Display &Tasks"
|
|
(
|
|
EXTension.ListTASK
|
|
)
|
|
SEPARATOR
|
|
MENUITEM "List Machines" "TASK.List.MACHINES"
|
|
MENUITEM "Display Task Tree" "TASK.List.TREE"
|
|
MENUITEM "Display Core Activity" "CORE.List"
|
|
)
|
|
//popup "&Help"
|
|
//(
|
|
// MENUITEM "[:manual]OS Awareness Manual Fiasco" "HELP __RTOS_FIASCO_"
|
|
//)
|
|
)
|
|
|
|
|
|
menu "task.lt"
|
|
(
|
|
default
|
|
//menuitem "Display detailed"
|
|
//(
|
|
// &address=address.offset(track.address())
|
|
// EXTension.ListThread &address
|
|
//)
|
|
menuitem "Display thread object"
|
|
(
|
|
PRIVATE &pAddress &nAddress &nMask
|
|
&pAddress=TRACK.ADDRESS()
|
|
&nAddress=ADDRESS.OFFSET(&pAddress)
|
|
&nMask=TASK.MASKOF("threadtocontext")
|
|
&pAddress=&pAddress-&nAddress+(&nAddress&(&nMask))
|
|
Var.View %Open %String (Thread*)(&pAddress)
|
|
)
|
|
menuitem "Display context object"
|
|
(
|
|
PRIVATE &pAddress &nAddress &nMask
|
|
&pAddress=TRACK.ADDRESS()
|
|
&nAddress=ADDRESS.OFFSET(&pAddress)
|
|
&nMask=TASK.MASKOF("threadtocontext")
|
|
&pAddress=&pAddress-&nAddress+(&nAddress&(&nMask))
|
|
Var.View %Open %String (Context*)(&pAddress)
|
|
)
|
|
menuitem "Display thread context"
|
|
(
|
|
PRIVATE &pAddress &nAddress &sExpr &sExprEx
|
|
&pAddress=TRACK.ADDRESS()
|
|
&nAddress=ADDRESS.OFFSET(&pAddress)
|
|
&sExpr=TASK.TASKCTX(&nAddress)
|
|
&sExprEx=TASK.VCPUCTX(&nAddress)
|
|
Var.View %Open %String %Hex &sExpr &sExprEx
|
|
)
|
|
separator
|
|
menuitem "Dump thread entry"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()
|
|
Data.dump &pAddress /Long /DIALOG
|
|
)
|
|
)
|
|
|
|
|
|
menu "task.lo"
|
|
(
|
|
default
|
|
//menuitem "Display detailed"
|
|
//(
|
|
// &address=address.offset(track.address())
|
|
// EXTension.ListObj &address
|
|
//)
|
|
menuitem "Display kernel object"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()
|
|
Var.View %M %String (Kobject*)(&pAddress)
|
|
)
|
|
separator
|
|
menuitem "Dump object entry"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()
|
|
Data.dump &pAddress /Long /DIALOG
|
|
)
|
|
)
|
|
|
|
|
|
menu "task.ltask"
|
|
(
|
|
default
|
|
menuitem "[:objects]Display detailed"
|
|
(
|
|
PRIVATE &nAddress
|
|
&nAddress=ADDRESS.OFFSET(TRACK.ADDRESS())
|
|
EXTension.ListTASK &nAddress
|
|
)
|
|
IF PRACTICE.FUNCtion.AVAILable(SYStem.Option.MACHINESPACES)
|
|
(
|
|
IF SYStem.Option.MACHINESPACES()
|
|
(
|
|
separator
|
|
menuitem "[:varframe]Display Stack Frame"
|
|
(
|
|
PRIVATE &nAddress &nVmid
|
|
&nAddress=ADDRESS.OFFSET(TRACK.ADDRESS())
|
|
IF TASK.VCPULIST(&nAddress,0)!=0x0
|
|
(
|
|
&nVmid=CONVert.HEXTOINT(TASK.VMID)(&nAddress))
|
|
GOSUB interactiveVcpuSelection "&nAddress" "Frame /MACHINE &nVmid /VCPU <VCPU>"
|
|
)
|
|
ELSE
|
|
(
|
|
PRINT %WARNing "Cannot show Stack Frame (Reason: no Thread available)"
|
|
)
|
|
)
|
|
menuitem "[:correlate]Switch Context"
|
|
(
|
|
PRIVATE &nAddress &nVmid
|
|
&nAddress=ADDRESS.OFFSET(TRACK.ADDRESS())
|
|
&nVmid=CONVert.HEXTOINT(TASK.VMID(&nAddress))
|
|
|
|
IF TASK.VCPULIST(&nAddress,0)==0x0
|
|
(
|
|
MACHINE.select &nVmid 0.
|
|
PRINT %WARNing "Context incomplete - only memory context (Reason: no Thread available)"
|
|
)
|
|
ELSE
|
|
(
|
|
GOSUB interactiveVcpuSelection "&nAddress" "MACHINE.select &nVmid <VCPU>"
|
|
)
|
|
)
|
|
)
|
|
)
|
|
separator
|
|
menuitem "[:var]Display Task object"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()
|
|
Var.View %Open %String (Task*)(&pAddress)
|
|
)
|
|
menuitem "[:var]Display Kobject object"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()
|
|
Var.View %Open %String (Kobject*)(&pAddress)
|
|
)
|
|
menuitem "[:var]Display Space object"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()+TASK.OFFSETOF(Task.Space)
|
|
Var.View %Open %String (Space*)(&pAddress)
|
|
)
|
|
menuitem "[:var]Display Mem_space object"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()+TASK.OFFSETOF(Task.Space)
|
|
Var.View %Open %String (Mem_space*)(&pAddress)
|
|
)
|
|
IF PRACTICE.FUNCtion.AVAILable(SYStem.Option.MACHINESPACES)
|
|
(
|
|
IF SYStem.Option.MACHINESPACES()
|
|
(
|
|
separator
|
|
menuitem "[:mmu]Show Guest/Task PageTable"
|
|
(
|
|
PRIVATE &nAddress &nVmid
|
|
&nAddress=ADDRESS.OFFSET(TRACK.ADDRESS())
|
|
&nVmid=CONVert.HEXTOINT(TASK.VMID(&nAddress))
|
|
MMU.List.PageTable /MACHINE &(nVmid)
|
|
)
|
|
menuitem "[:mmu]Show Intermediate PageTable"
|
|
(
|
|
PRIVATE &nAddress &nVmid
|
|
&nAddress=ADDRESS.OFFSET(TRACK.ADDRESS())
|
|
&nVmid=CONVert.HEXTOINT(TASK.VMID(&nAddress))
|
|
MMU.List.IntermedPageTable /MACHINE &(nVmid)
|
|
)
|
|
)
|
|
)
|
|
separator
|
|
menuitem "[:dump]Dump object entry"
|
|
(
|
|
PRIVATE &pAddress
|
|
&pAddress=TRACK.ADDRESS()
|
|
Data.dump &pAddress /Long /DIALOG
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
SUBROUTINE interactiveVcpuSelection
|
|
(
|
|
PRIVATE &nMagic &sCmd &nVcpuMagic &nVcpu &sVcpus
|
|
PARAMETERS &nMagic &sCmd
|
|
&nVcpuMagic=TASK.VCPULIST(&nMagic,0)
|
|
IF (&nVcpuMagic==0x0)
|
|
(
|
|
RETURN
|
|
)
|
|
|
|
&nVcpu=0.
|
|
WHILE (&nVcpuMagic!=0x0)
|
|
(
|
|
SPRINTF &sVcpus "%s,%u." "&sVcpus" &nVcpu
|
|
&nVcpu=&nVcpu+1.
|
|
&nVcpuMagic=TASK.VCPULIST(&nMagic,&nVcpuMagic)
|
|
)
|
|
&sVcpus=STRing.CUT("&sVcpus",1.)
|
|
IF (&nVcpu==1.)
|
|
(
|
|
&sExec=STRing.Replace("&sCmd","<VCPU>","&sVcpus",0.)
|
|
ON ERROR CONTinue
|
|
&sExec
|
|
ON ERROR inherit
|
|
RETURN
|
|
)
|
|
DIALOG
|
|
(&+
|
|
TEXT "Please select a VCPU"
|
|
VCPUS: COMBOBOX "&sVcpus" ""
|
|
BUTTON "OK"
|
|
(
|
|
PRIVATE &sVcpu &sExec
|
|
&sVcpu=DIALOG.STRing(VCPUS)
|
|
&sExec=STRing.Replace("&sCmd","<VCPU>","&sVcpu",0.)
|
|
ON ERROR CONTinue
|
|
&sExec
|
|
ON ERROR inherit
|
|
DIALOG.END
|
|
ENDDO
|
|
)
|
|
)
|
|
)
|