---------- Forwarded message ---------- From: mihai pricopi <[email protected]> Date: Thu, Aug 26, 2010 at 1:19 PM Subject: Re: Get values per thread To: Volos Stavros <[email protected]>
Hi Stavros, Ok so: >cpu_list=X 188e530 >cpu_list/16X cpu_list: cpu_list: 0 180c000 556c7472 61535041 52432d49 49490000 0 68633a2f 2f2f636f 6d706f6e 656e743d 2f4e302f 53423000 0 0 0 > cpu0=X 180c000 > cpu0/16X cpu0: cpu0: 0 0 1b0000 0 0 180c000 2a1 1fcc0 2a1 1fcc0 2a1 327cc0 0 0 0 0 So what I did was to modify the KernelVadd_cpu_list value to 188e530 and then I read the content of it in Flexus. Thanks, Mihai On Thu, Aug 26, 2010 at 1:02 PM, Volos Stavros <[email protected]> wrote: > You want to know the virtual address of the cpu_list, because as I told you > before the WhiteBox component uses the variable KernelVadd_cpu_list. For > some reason the value is 0. If you read the next values are non-zero. The > document > that you are referring to is written in 2001 while Solaris 10 was shipped in > 2005. In 2001 > the most recent version was Solaris8 so the document applies for Solaris 8. > > What is the output that you get when you use the following commands? > > cpu_list=X > cpu_list/16X > cpu0=X > cpu0/16X > > Cheers, > -Stavros > > On Aug 25, 2010, at 9:26 PM, mihai pricopi wrote: > >> Hi Stavros, >> >> cpu_list/X doesn't mean the content of the address value of the cpu_list ? >> I took the cpu_list address using = X then I put it in the flexus >> WhiteBox and still the content of the it is 0. I would expect the >> content of the address cpu_list be another address. In WhiteBox the >> code takes the content, convert it to a VirtualAddress and then read >> again from this address. >> So when I run cpu_list/X at prompt I get 0. I followed this: >> >> http://www.docstoc.com/docs/418851/solaris_internals >> >> At page 45 they show how the walk the cpu_list. The content of the >> cpu_list pointer is not 0 in there. >> Why would be 0 in our simulated machine ? >> >> >> Regards, >> Mihai >> >> On Thu, Aug 26, 2010 at 12:21 PM, Volos Stavros <[email protected]> >> wrote: >>> Hi Mihai, >>> >>> The '/' shows the value of the virtual address you specify. If you really >>> want to get cpu_list >>> value (address) then you need to use '='. >>> >>> Regards, >>> -Stavros >>> >>> On Aug 24, 2010, at 7:40 PM, mihai pricopi wrote: >>> >>>> ---------- Forwarded message ---------- >>>> From: mihai pricopi <[email protected]> >>>> Date: Wed, Aug 25, 2010 at 9:22 AM >>>> Subject: Re: Get values per thread >>>> To: Volos Stavros <[email protected]> >>>> >>>> >>>> Hi Stavros, >>>> >>>> So I have Solaris10 running in Simics and at prompt I tried 2 versions: >>>> >>>> 1) mdb -k and then I try to check the content of the cpu_list with >>>> cpu_list/X and is 0 >>>> 2) adb -k /dev/ksyms /dev/mem and the same when I try cpu_list/X is 0. >>>> >>>> In kernel there is an array of cpu_t which is cpu_t *cpu[]. I tried >>>> to read the content of cpu with cpu/X and is also 0. Would it be >>>> because of some OS protection or do I have to set the OS boot in a >>>> specific mode ? >>>> >>>> Thanks, >>>> Mihai >>>> >>>> On Wed, Aug 25, 2010 at 12:22 AM, Volos Stavros <[email protected]> >>>> wrote: >>>>> Hi, >>>>> >>>>> It's been a long time since I last used the debugger but I was able to >>>>> get a value for the >>>>> cpu_list pointer that was not zero. Which command are you using? >>>>> >>>>> -Stavros >>>>> ________________________________________ >>>>> From: mihai pricopi [[email protected]] >>>>> Sent: Tuesday, August 24, 2010 11:49 AM >>>>> To: Volos Stavros >>>>> Cc: [email protected] >>>>> Subject: Re: Get values per thread >>>>> >>>>> Hi, >>>>> >>>>> Yes indeed the pointer in Solaris 10 on 64bit is 8byte long. But I >>>>> still don't get why the cpu_list pointer is NULL. I created a new >>>>> machine and is still the same. This list is supposed to be initialised >>>>> at booting time ... >>>>> >>>>> Mihai >>>>> >>>>> On Tue, Aug 24, 2010 at 3:02 PM, mihai pricopi <[email protected]> >>>>> wrote: >>>>>> Hi, >>>>>> >>>>>> Under mdb -K I tried to read the content of cpu_list which shall be >>>>>> an address. But the value is 0. I wonder if this should be 0 or maybe >>>>>> I`m doing something wrong in the debugger. Did you try in the debugger >>>>>> to read the value of the pointer and see it ? >>>>>> >>>>>> Thanks, >>>>>> Mihai >>>>>> >>>>>> On Tue, Aug 24, 2010 at 1:23 AM, Volos Stavros <[email protected]> >>>>>> wrote: >>>>>>> Hi Mihai, >>>>>>> >>>>>>> The pointers in Solaris are 8 bytes so you need to use 8. For cpu_id, >>>>>>> t_id etc you only need 4 bytes. >>>>>>> >>>>>>> Did you assign the new value to KernelVaddr_cpu_list variable ? >>>>>>> >>>>>>> Currently you have, >>>>>>> >>>>>>> // boost::tie( paddr, ignored1, ignored2) = >>>>>>> cpu->translateTSB_SimicsImpl(VirtualMemoryAddress(cpu_ptr + 0x10), 4 >>>>>>> /*NUCLEUS*/ ); >>>>>>> // cpu_ptr = >>>>>>> VirtualMemoryAddress(cpu->readVAddr(VirtualMemoryAddress(cpu_ptr + >>>>>>> 0x48), 4 /*NUCLEUS*/, 8)); //next CPU pointer at offset 0x48 - solaris8 >>>>>>> >>>>>>> The first line reads the thread id from the cpu struct (current thread >>>>>>> field) and the second line reads the pointer in the next cpu (cpu_next >>>>>>> field). >>>>>>> You need to come up with the values that are valid for Solaris 10. >>>>>>> >>>>>>> Cheers, >>>>>>> -Stavros >>>>>>> ________________________________________ >>>>>>> From: mihai pricopi [[email protected]] >>>>>>> Sent: Friday, August 20, 2010 10:23 AM >>>>>>> To: Volos Stavros >>>>>>> Cc: [email protected] >>>>>>> Subject: Re: Get values per thread >>>>>>> >>>>>>> Hello, >>>>>>> >>>>>>> I tried to do as you suggested with the cpu_list pointer but I have >>>>>>> troubles understand why : >>>>>>> cpuX->readVAddr(VirtualMemoryAddress(addr), 4, 4); >>>>>>> >>>>>>> is not working. So first I took the cpuvar.h from the Solaris10 >>>>>>> operating system. There there is this set of variables: >>>>>>> >>>>>>> extern struct cpu *cpu[]; /* indexed by CPU number */ >>>>>>> extern cpu_t *cpu_list; /* list of CPUs */ >>>>>>> extern int ncpus; /* number of CPUs present */ >>>>>>> extern int ncpus_online; /* number of CPUs not quiesced */ >>>>>>> extern int max_ncpus; /* max present before ncpus is known */ >>>>>>> extern int boot_max_ncpus; /* like max_ncpus but for real */ >>>>>>> extern processorid_t max_cpuid; /* maximum CPU number */ >>>>>>> extern struct cpu *cpu_inmotion; /* offline or partition move >>>>>>> target */ >>>>>>> >>>>>>> While OS running I debugged it using mdb -K and looking for the >>>>>>> addresses of the symbols. I took the addresses for the ncpus and >>>>>>> cpu_list and cpu[]. If I do this: >>>>>>> >>>>>>> VirtualMemoryAddress kernel_ncpus(ncpus_add); >>>>>>> uint64_t kernelCpus = >>>>>>> cpuX->readVAddr(VirtualMemoryAddress(kernel_ncpus), 4, 4); >>>>>>> >>>>>>> The value is correct in this case. Then I tried to see the structure of >>>>>>> the struct cpu which is: >>>>>>> >>>>>>> /* >>>>>>> * Per-CPU data. >>>>>>> */ >>>>>>> typedef struct cpu { >>>>>>> processorid_t cpu_id; /* CPU number */ >>>>>>> processorid_t cpu_seqid; /* sequential CPU id (0..ncpus-1) */ >>>>>>> volatile cpu_flag_t cpu_flags; /* flags indicating CPU state */ >>>>>>> struct cpu *cpu_self; /* pointer to itself */ >>>>>>> kthread_t *cpu_thread; /* current thread */ >>>>>>> kthread_t *cpu_idle_thread; /* idle thread for this CPU */ >>>>>>> kthread_t *cpu_pause_thread; /* pause thread for this CPU */ >>>>>>> klwp_id_t cpu_lwp; /* current lwp (if any) */ >>>>>>> klwp_id_t cpu_fpowner; /* currently loaded fpu owner */ >>>>>>> struct cpupart *cpu_part; /* partition with this CPU */ >>>>>>> struct lgrp_ld *cpu_lpl; /* pointer to this cpu's load */ >>>>>>> struct chip *cpu_chip; /* cpu's chip data */ >>>>>>> int cpu_rechoose; /* cpu's rechoose_interval */ >>>>>>> int cpu_cache_offset; /* see kmem.c for details */ >>>>>>> .............................................................................................. >>>>>>> >>>>>>> So theoretically if I red the cpu_id should be the cpuid of the current >>>>>>> cpu. I tried this: >>>>>>> >>>>>>> VirtualMemoryAddress kernel_cpuid(cpu_list_add); >>>>>>> VirtualMemoryAddress cpuIdAddr = >>>>>>> VirtualMemoryAddress(cpu1->readVAddr(VirtualMemoryAddress(kernel_cpuid), >>>>>>> 4,8)); >>>>>>> uint64_t mycpuId = cpu1->readVAddr(VirtualMemoryAddress(cpuIdAddr), >>>>>>> 4,4); >>>>>>> >>>>>>> if I execute this in WhiteBox constructor and run it everytime the >>>>>>> value is 0 regardless of the processor. >>>>>>> >>>>>>> May I also ask why the last argument for the VirtualMemoryAddress is 8 >>>>>>> when I read a pointer and 4 when I read data ? >>>>>>> >>>>>>> >>>>>>> On Thu, Jul 29, 2010 at 1:00 AM, Volos Stavros >>>>>>> <[email protected]<mailto:[email protected]>> wrote: >>>>>>> In the WhiteBoxImpl.cpp there is a function get_thread_t(aCPU). This >>>>>>> function >>>>>>> returns the thread_t pointer of the cpu struct. Actually there is a cpu >>>>>>> list in the >>>>>>> kernel. There is an offset to find the next cpu in the list. Then >>>>>>> inside the cpu struct >>>>>>> there is a pointer in a thread_t struct where you can find the thread >>>>>>> id. >>>>>>> >>>>>>> The numbers 0x10, 0x48 are hardcoded for Solaris 8. >>>>>>> >>>>>>> You can look in Open solaris source code to see what is true for >>>>>>> Solaris 10 >>>>>>> >>>>>>> http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/sys/cpuvar.h#cpu_t >>>>>>> >>>>>>> You will also need to find the virtual address of the cpu_list in the >>>>>>> kernel. You can use >>>>>>> the kernel debugger (kdb). >>>>>>> >>>>>>> Regards, >>>>>>> -Stavros >>>>>>> >>>>>>> ________________________________ >>>>>>> From: mihai pricopi >>>>>>> [[email protected]<mailto:[email protected]>] >>>>>>> Sent: Wednesday, July 28, 2010 12:44 PM >>>>>>> To: Volos Stavros >>>>>>> Cc: [email protected]<mailto:[email protected]> >>>>>>> >>>>>>> Subject: Re: Get values per thread >>>>>>> >>>>>>> Hello, >>>>>>> >>>>>>> I`m trying to understand how the white box is working. I see this code >>>>>>> where I suppose I have to find the answer: >>>>>>> >>>>>>> struct WhiteBoxImpl : WhiteBox { >>>>>>> API::symtable_interface_t * theSymTable; >>>>>>> >>>>>>> std::vector< PhysicalMemoryAddress > theThreadTs; >>>>>>> std::vector< PhysicalMemoryAddress > theIdleThreadTs; >>>>>>> >>>>>>> WhiteBoxImpl() { >>>>>>> #if FLEXUS_TARGET_IS(v9) >>>>>>> API::SIM_load_module("symtable"); >>>>>>> API::conf_class_t * symtable_class = API::SIM_get_class("symtable"); >>>>>>> API::conf_object_t * symtable_obj = >>>>>>> API::SIM_new_object(symtable_class, "flexus_symtable"); >>>>>>> theSymTable = reinterpret_cast<API::symtable_interface_t >>>>>>> *>(API::SIM_get_class_interface(symtable_class, "symtable")); >>>>>>> >>>>>>> for (int32_t i = 0; i < API::SIM_number_processors(); ++i) { >>>>>>> API::conf_object_t * ctx = >>>>>>> API::SIM_get_attribute(Simics::APIFwd::SIM_get_processor(i), >>>>>>> "current_context").u.object; >>>>>>> API::attr_value_t val; >>>>>>> val.kind = API::Sim_Val_Object; >>>>>>> val.u.object = symtable_obj; >>>>>>> API::SIM_set_attribute(ctx, "symtable", &val); >>>>>>> } >>>>>>> API::attr_value_t arch = API::SIM_get_attribute( >>>>>>> Simics::APIFwd::SIM_get_processor(0), "architecture"); >>>>>>> API::SIM_set_attribute( symtable_obj, "arch", &arch); >>>>>>> >>>>>>> DBG_(Dev, ( << "symtable loaded" ) ); >>>>>>> #endif >>>>>>> >>>>>>> >>>>>>> } >>>>>>> >>>>>>> The problem is that I don't know which thread is being executed because >>>>>>> I suspect Solaris10 is doing the thread migration meanwhile and I can't >>>>>>> rely on the values until I see per thread. Does the ctx hold the >>>>>>> information about the current thread that the timing simulation is >>>>>>> executing per core ? >>>>>>> >>>>>>> Thanks >>>>>>> Mihai >>>>>>> >>>>>>> On Wed, Jul 28, 2010 at 4:22 AM, Volos Stavros >>>>>>> <[email protected]<mailto:[email protected]>> wrote: >>>>>>> Actually, the component WhiteBox is responsible to give the thread id >>>>>>> of the thread >>>>>>> that is being executed in a particular CPU. However, this component is >>>>>>> hardcoded >>>>>>> for Solaris 8. I worked on this component to support Solaris 10, but I >>>>>>> didn't have time >>>>>>> to check whether it works properly or not. >>>>>>> >>>>>>> Assuming that you know which thread is being executed, it should be >>>>>>> easy to get >>>>>>> measured values per software thread. >>>>>>> >>>>>>> Regards, >>>>>>> -Stavros >>>>>>> >>>>>>> ________________________________ >>>>>>> From: mihai pricopi >>>>>>> [[email protected]<mailto:[email protected]>] >>>>>>> Sent: Tuesday, July 27, 2010 6:07 PM >>>>>>> To: Volos Stavros >>>>>>> Subject: Re: Get values per thread >>>>>>> >>>>>>> Per software thread. I discovered that Solaris modifies a register when >>>>>>> it does the context switch but I`m not sure where exactly in flexus i >>>>>>> can read that register and if flexus already gives me this information ? >>>>>>> >>>>>>> Thanks >>>>>>> >>>>>>> On Tue, Jul 27, 2010 at 11:55 PM, Volos Stavros >>>>>>> <[email protected]<mailto:[email protected]>> wrote: >>>>>>> Hi Mihai, >>>>>>> >>>>>>> What do you mean by the term "thread"? Do you mean software thread or >>>>>>> hardware thread (multithreaded >>>>>>> processor) ? >>>>>>> >>>>>>> Regards, >>>>>>> -Stavros >>>>>>> >>>>>>> ________________________________ >>>>>>> From: mihai pricopi >>>>>>> [[email protected]<mailto:[email protected]>] >>>>>>> Sent: Tuesday, July 27, 2010 12:57 PM >>>>>>> To: [email protected]<mailto:[email protected]> >>>>>>> Subject: Get values per thread >>>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> Is it possible that Flexus can give measured values per thread not per >>>>>>> core ? >>>>>>> >>>>>>> Thanks >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>> >>> >>> > >
