Hmm, I've been using magic instructions in SE mode for years now.  Jason
can you maybe shed some light on this? Have I been getting lucky or is
there something we are missing?

I'm using TimingSimpleCPU or DerivO3CPU (this is the GPU model, so we're
more limited).

To be clear, the pseudo-instructions are being called, no problems. I can
see them executing with the PseudoInst debug flag.
It's just that the return values don't show up unless I explicitly set Rax
two_byte_opcodes.isa which is how it used to work.
(And It is working properly and consistently with Rax set explicitly)

Where is the "store" in pseudo_inst_abi.hh supposed to be called from? We
could maybe add a check for SE mode and explicitly call it at the end of
pseudoInstWork() or something?

Cheers,

Dan


On Mon, Nov 9, 2020 at 9:20 PM Gabe Black <gabe.bl...@gmail.com> wrote:

> Using the m5 library in SE mode is somewhat uncharted waters. You'd need
> the access to /dev/mem to be captured and to map memory in the simulation
> and not on the host, or Very Bad Things might happen to your host computer.
> If the functions are defined in the header but you can't use them, you
> should make sure you're actually getting the right header and not some
> other, older version. The code which implements the ABI for address based
> m5 ops in x86 is in src/arch/x86/tlb.cc in finalizePhysical, where it sets
> the "local accessor" for the request, aka a callback which handles an
> access which conceptually does not go out into the memory system and is
> instead handled inside the CPU. The default, instruction based mechanism
> will *not* work on a KVM based CPU (if that's what you're using), and so no
> pseudo inst code of any kind will be invoked. If you're actually triggering
> the address based mechanism but you're not using a virtual address which
> maps to the correct physical address (the physical address is what's
> special), then no pseudo inst code will be triggered then either. Basically
> if you don't do the right dance to get gem5's attention, then it won't know
> you're trying to do a pseudo instruction and will do something else
> instead. Unfortunately exactly what gets through from whatever the CPU
> model is to get gem5's attention varies (necessarily) based on how the CPU
> is implemented, which is why there are all these different calling
> mechanisms, and some attempt to organize them more systematically in the
> utility.
>
> Gabe
>
> On Mon, Nov 9, 2020 at 4:40 PM Daniel Gerzhoy <daniel.gerz...@gmail.com>
> wrote:
>
>> Hi Gabe,
>>
>> I can see where the register should be stored (line 59 in
>> pseudo_inst_abi.hh) but I put a print there and it never gets called for
>> the calls that I am making at least.
>>
>> When i try to use m5_exit_addr and other functions with that suffix I get
>> a "error: 'm5_exit_addr' was not declared in this scope"
>> Which makes sense because m5ops.h doesn't declare the functions, I can
>> see they are built by macro though.
>>
>> I've also tried to run map_m5_mem() but I get the "Can't open /dev/mem"
>> error message.
>>
>> Could you point me to, or could you quickly throw together an example
>> 'hello-world' type program and build process for SE mode?
>>
>> Thanks,
>>
>> Dan
>>
>>
>>
>>
>> On Mon, Nov 9, 2020 at 6:48 PM Matt Sinclair via gem5-users <
>> gem5-users@gem5.org> wrote:
>>
>>> Hi Gabe,
>>>
>>> I don't have the broken build in front of me, and it's possible it is
>>> because I'm running on an Ubuntu 16 machine, but I had to add c+11 per the
>>> error message I got when debugging this.  If c++14 works though, great.
>>>
>>> Thanks for the updated info -- I built the tutorial out of the old one,
>>> so next time I'll make sure to update it accordingly.
>>>
>>> Thanks,
>>> Matt
>>>
>>> On Mon, Nov 9, 2020 at 5:44 PM Gabe Black via gem5-users <
>>> gem5-users@gem5.org> wrote:
>>>
>>>> BTW, I do think I need to explicitly set the c++ version in the scons
>>>> file, like in Matt's original email above. I'd probably set it to c++14
>>>> though, to be consistent with gem5 proper. I think that will likely fix a
>>>> build issue Bobby had with an older (7.x I think) version of gcc, where the
>>>> default version is probably different from the compiler I'm using (10.x I
>>>> think).
>>>>
>>>> Gabe
>>>>
>>>> On Mon, Nov 9, 2020 at 1:50 PM Gabe Black <gabe.bl...@gmail.com> wrote:
>>>>
>>>>> Hi folks. If you're using the magic address based version of the gem5
>>>>> ops, then you should call, for instance, m5_exit_addr and not just 
>>>>> m5_exit.
>>>>> The "normal" functions are now always the magic instructions which
>>>>> essentially only gem5 CPU models know how to execute. All call mechanisms
>>>>> are built into the library at once now so you can use the same binary on
>>>>> the KVM CPU, native gem5 CPUs, etc.
>>>>>
>>>>> You also should not change the scons files when you build. The old
>>>>> Makefile based setup required tinkering with things to get the build you
>>>>> wanted, but that is no longer necessary. If you need to, that's a bug and
>>>>> we should look into it. The lines you're commenting out just set the
>>>>> default magic address, and that's only there for legacy reasons. You can
>>>>> set the address to use from the command line if you're using the m5
>>>>> utility, or by setting the m5op_addr variable if using the library. You
>>>>> still have to run map_m5_mem to make the magic physical address visible to
>>>>> userspace for the library to work, or otherwise set up a virtual to
>>>>> physical mapping if you were, for instance, running in the kernel which
>>>>> somebody was doing recently.
>>>>>
>>>>> If you try to use a call mechanism that isn't supported by your CPU
>>>>> model, then the behavior will be unpredictable. For x86 on the KVM CPU for
>>>>> example, the special gem5 instructions will do whatever they look like 
>>>>> they
>>>>> should do on real hardware. That may be a nop, it may be to generate an
>>>>> undefined instruction exception, etc. If it's a nop, it will just leave
>>>>> whatever is in RAX in RAX.
>>>>>
>>>>> Also, argument values and return values are now handled by a layer
>>>>> which knows and applies the actual ABI rules for a given ISA and for the
>>>>> specific types of the arguments and return value. There should be no 
>>>>> reason
>>>>> to change the code which is calling the pseudo instruction to explicitly
>>>>> set RAX, especially if you're using the address based calling mechanism
>>>>> which doesn't go through that path at all.
>>>>>
>>>>> Gabe
>>>>>
>>>>> On Mon, Nov 9, 2020 at 1:06 PM Matt Sinclair via gem5-users <
>>>>> gem5-users@gem5.org> wrote:
>>>>>
>>>>>> Hi Dan,
>>>>>>
>>>>>> My comment was just a general comment on the m5ops -- I thought you
>>>>>> were using the "old" format for building m5ops and that might have been 
>>>>>> the
>>>>>> problem.  Sounds like it wasn't.
>>>>>>
>>>>>> I think pushing a fix to develop and tagging Gabe and Jason as
>>>>>> reviewers is probably the right strategy.
>>>>>>
>>>>>> Thanks,
>>>>>> Matt
>>>>>>
>>>>>> On Mon, Nov 9, 2020 at 2:33 PM Daniel Gerzhoy <
>>>>>> daniel.gerz...@gmail.com> wrote:
>>>>>>
>>>>>>> I found the issue and fixed it.
>>>>>>>
>>>>>>> The return value wasn't being put into the Rax register in
>>>>>>> src/arch/x86/isa/decoder/two_byte_opcodes.isa
>>>>>>>
>>>>>>>             0x4: BasicOperate::gem5Op({{
>>>>>>>                 uint64_t ret;
>>>>>>>                 bool recognized =
>>>>>>> PseudoInst::pseudoInst<X86PseudoInstABI>(
>>>>>>>                         xc->tcBase(), IMMEDIATE, ret);
>>>>>>>                 if (!recognized)
>>>>>>>                     fault = std::make_shared<InvalidOpcode>();
>>>>>>>                 Rax = ret;
>>>>>>>
>>>>>>> //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Added This
>>>>>>>             }}, IsNonSpeculative);
>>>>>>>
>>>>>>>   This code was simplified with the new abi stuff and the Rax = ret;
>>>>>>> must have been lost in the shuffle.
>>>>>>>
>>>>>>> I could push the fix to develop, or should I just make an issue on
>>>>>>> Jira?
>>>>>>>
>>>>>>> Best,
>>>>>>>
>>>>>>> Dan
>>>>>>>
>>>>>>> On Mon, Nov 9, 2020 at 2:50 PM Daniel Gerzhoy <
>>>>>>> daniel.gerz...@gmail.com> wrote:
>>>>>>>
>>>>>>>> Let me further say that I know that the magic instructions are
>>>>>>>> being called. I am just getting bogus return values.
>>>>>>>>
>>>>>>>> On Mon, Nov 9, 2020 at 2:18 PM Daniel Gerzhoy <
>>>>>>>> daniel.gerz...@gmail.com> wrote:
>>>>>>>>
>>>>>>>>> Hi Matt,
>>>>>>>>>
>>>>>>>>> Thanks for this, it's very helpful. However after following the
>>>>>>>>> instructions (I had to extrapolate a little because of the directory
>>>>>>>>> structure changes you mentioned) I get the same result: Nill returns 
>>>>>>>>> from
>>>>>>>>> the magic instructions.
>>>>>>>>> Actually It isn't nill, but a constant no matter what. If I
>>>>>>>>> compile my program with -O0 its nill, if with -O2 its: 4198192, which 
>>>>>>>>> is
>>>>>>>>> suspicious.
>>>>>>>>>
>>>>>>>>> To clarify, are these updated instructions specifically meant to
>>>>>>>>> fix this issue I am running into? Or just general instructions to 
>>>>>>>>> build
>>>>>>>>> m5op.o
>>>>>>>>>
>>>>>>>>> Here are the specific changes I made according to the link you
>>>>>>>>> provided, the supplemental instructions, and extrapolating based on 
>>>>>>>>> the
>>>>>>>>> directory structure change.
>>>>>>>>>
>>>>>>>>> 1. In SConsopts I commented both:
>>>>>>>>>
>>>>>>>>> --- a/util/m5/src/abi/x86/SConsopts
>>>>>>>>> +++ b/util/m5/src/abi/x86/SConsopts
>>>>>>>>> @@ -27,8 +27,8 @@ Import('*')
>>>>>>>>>
>>>>>>>>>  env['ABI'] = 'x86'
>>>>>>>>>  get_abi_opt('CROSS_COMPILE', '')
>>>>>>>>> -env.Append(CXXFLAGS='-DM5OP_ADDR=0xFFFF0000')
>>>>>>>>> -env.Append(CCFLAGS='-DM5OP_ADDR=0xFFFF0000')
>>>>>>>>> +#env.Append(CXXFLAGS='-DM5OP_ADDR=0xFFFF0000')
>>>>>>>>> +#env.Append(CCFLAGS='-DM5OP_ADDR=0xFFFF0000')
>>>>>>>>>
>>>>>>>>>  env['CALL_TYPE']['inst'].impl('m5op.S', 'verify_inst.cc')
>>>>>>>>>  env['CALL_TYPE']['addr'].impl('m5op_addr.S', default=True)
>>>>>>>>>
>>>>>>>>> 2. In SConstruct I added:
>>>>>>>>>
>>>>>>>>> --- a/util/m5/SConstruct
>>>>>>>>> +++ b/util/m5/SConstruct
>>>>>>>>> @@ -44,7 +44,9 @@ def abspath(d):
>>>>>>>>>
>>>>>>>>>  # Universal settings.
>>>>>>>>>  main.Append(CXXFLAGS=[ '-O2' ])
>>>>>>>>> +main.Append(CXXFLAGS=[ '-std=c++11' ])
>>>>>>>>>  main.Append(CCFLAGS=[ '-O2' ])
>>>>>>>>>  main.Append(CPPPATH=[ common_include ])
>>>>>>>>>
>>>>>>>>> The compilation process compiles m5op.S with gcc though, so c++11
>>>>>>>>> doesn't have any effect on it. Not sure if that matters.
>>>>>>>>>
>>>>>>>>> 3. Finally I linked both m5_mmap.o and m5op.o as per the
>>>>>>>>> instructions but I am a little wary of m5_mmap
>>>>>>>>>
>>>>>>>>> What does m5_mmap actually do if I don't have M5OP_ADDR defined.
>>>>>>>>> It looks like nothing? Do I need to link it?
>>>>>>>>>
>>>>>>>>> *Is there something inside the program I need to do before calling
>>>>>>>>> magic instructions that has to do with m5_mmap?*
>>>>>>>>>
>>>>>>>>> Thanks for your help,
>>>>>>>>>
>>>>>>>>> Dan
>>>>>>>>>
>>>>>>>>> On Mon, Nov 9, 2020 at 12:12 PM Matt Sinclair <
>>>>>>>>> mattdsincl...@gmail.com> wrote:
>>>>>>>>>
>>>>>>>>>> Hi Dan,
>>>>>>>>>>
>>>>>>>>>> In recent weeks, Gabe (if I recall correctly) updated how the
>>>>>>>>>> m5ops are created.  I had created a homework assignment for my 
>>>>>>>>>> course about
>>>>>>>>>> it:
>>>>>>>>>> https://pages.cs.wisc.edu/~sinclair/courses/cs752/fall2020/handouts/hw3.html
>>>>>>>>>> (see #2), but this is now already out of date as the location of 
>>>>>>>>>> some files
>>>>>>>>>> changed.  The updated instructions are:
>>>>>>>>>>
>>>>>>>>>> 1.  Update $GEM5_ROOT/util/m5/SConstruct, add a new line between
>>>>>>>>>> the current lines 46 and 47:
>>>>>>>>>>
>>>>>>>>>> main.Append(CXXFLAGS=[ '-O2' ])
>>>>>>>>>> *+main.Append(CXXFLAGS=[ '-std=c++11' ])*
>>>>>>>>>>
>>>>>>>>>> main.Append(CCFLAGS=[ '-O2' ])
>>>>>>>>>>
>>>>>>>>>> 2.  Now run the same command you ran in step 2 of the above link:
>>>>>>>>>>
>>>>>>>>>> scons build/x86/out/m5
>>>>>>>>>>
>>>>>>>>>> 3.  This will create the same two .o files in step 2 of the above
>>>>>>>>>> link, in the same places (although the location of m5op.o may
>>>>>>>>>> have changed to include/gem5 util/m5/build/x86/abi/x86/
>>>>>>>>>> according to some of the students in my course).
>>>>>>>>>> Matt
>>>>>>>>>>
>>>>>>>>>> On Mon, Nov 9, 2020 at 9:25 AM Daniel Gerzhoy via gem5-users <
>>>>>>>>>> gem5-users@gem5.org> wrote:
>>>>>>>>>>
>>>>>>>>>>> Hey all,
>>>>>>>>>>>
>>>>>>>>>>> I've recently updated to using the dev branch for my GCN3
>>>>>>>>>>> simulations. I've noticed that I am now getting return values of 0 
>>>>>>>>>>> for
>>>>>>>>>>> every magic instruction (m5_rpns for instance).
>>>>>>>>>>>
>>>>>>>>>>> Is there a special way I need to be compiling/linking m5ops.S to
>>>>>>>>>>> get the return values to show up correctly? Or might this be a bug?
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>>
>>>>>>>>>>> Dan
>>>>>>>>>>> _______________________________________________
>>>>>>>>>>> gem5-users mailing list -- gem5-users@gem5.org
>>>>>>>>>>> To unsubscribe send an email to gem5-users-le...@gem5.org
>>>>>>>>>>> %(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s
>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>>>>>> gem5-users mailing list -- gem5-users@gem5.org
>>>>>> To unsubscribe send an email to gem5-users-le...@gem5.org
>>>>>> %(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s
>>>>>
>>>>> _______________________________________________
>>>> gem5-users mailing list -- gem5-users@gem5.org
>>>> To unsubscribe send an email to gem5-users-le...@gem5.org
>>>> %(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s
>>>
>>> _______________________________________________
>>> gem5-users mailing list -- gem5-users@gem5.org
>>> To unsubscribe send an email to gem5-users-le...@gem5.org
>>> %(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s
>>
>>
_______________________________________________
gem5-users mailing list -- gem5-users@gem5.org
To unsubscribe send an email to gem5-users-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to