; -------------------------------------------------------------------------------- ; @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 " ) 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 " ) ) ) ) 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","","&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","","&sVcpu",0.) ON ERROR CONTinue &sExec ON ERROR inherit DIALOG.END ENDDO ) ) )