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