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
>>>> 
>>>> 
>>>> 
>>>> 
>>> 
>> 

Reply via email to