qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2] SPARC: Add and use CPU_FEATURE_CASA


From: Fabien Chouteau
Subject: Re: [Qemu-devel] [PATCH v2] SPARC: Add and use CPU_FEATURE_CASA
Date: Thu, 13 Feb 2014 16:50:20 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0

On 02/13/2014 03:55 PM, Fabien Chouteau wrote:
> On 02/13/2014 02:00 PM, Sebastian Huber wrote:
>> On 2014-02-13 13:01, Fabien Chouteau wrote:
>>> On 02/13/2014 10:52 AM, Sebastian Huber wrote:
>>>> The LEON3 processor has support for the CASA instruction which is
>>>> normally only available for SPARC V9 processors.  Binutils 2.24
>>>> and GCC 4.9 will support this instruction for LEON3.  GCC uses it to
>>>> generate C11 atomic operations.
>>>>
>>>> The CAS synthetic instruction uses an ASI of 0x80.  If TARGET_SPARC64 is
>>>> not defined use a supervisor data load/store for an ASI of 0x80 in
>>>> helper_ld_asi()/helper_st_asi().
>>>>
>>>
>>> Hello Sebastian,
>>>
>>> If I understand correctly, the difference with V1 is that ASI 0x80. Why
>>> did you chose Supervisor data access against User data access?
>>
>> User data access would work also.  I don't have a preference here.
>>
>>> (I cannot
>>> find documentation about 0x80 ASI)
>>
>> GCC will generate CAS instructions, e.g.
> 
> ...
> 
>> In the GNU Binutils you find:
>>
>> opcodes/sparc-opc.c:{ "cas",    F3(3, 0x3c, 0)|ASI(0x80), F3(~3, ~0x3c, 
>> ~0)|ASI(~0x80), "[1],2,d", F_ALIAS, 0, v9andleon }, /* casa 
>> [rs1]ASI_P,rs2,rd */
>>
>> This is where the 0x80 comes from.
>>
> 
> In some leon3 doc I found this:
> 
> 62.2.7 Compare and Swap instruction (CASA)
> LEON3 implements the SPARC V9 Compare and Swap Alternative (CASA) 
> instruction. The CASA
> is enabled the interger load delay is set to 1 and the NOTAG generic is 0. 
> The CASA operates as
> described in the SPARC V9 manual. The instruction is privileged but setting 
> ASI = 0xA (user data)
> will allow it to be used in user mode.
> 
> Which confirm privileged instruction. I will ask our GCC expert if they
> know where that 0x80 ASI comes from.
> 

This ASI 0x80 is really defined nowhere in Leon3 not even in the sources :)
Maybe there's a bug in binutils... Did you try to run this program on a real 
board?

--- sparc.vhd ---

subtype asi_type is std_logic_vector(4 downto 0);

constant ASI_SYSR    : asi_type := "00010"; -- 0x02
constant ASI_UINST   : asi_type := "01000"; -- 0x08
constant ASI_SINST   : asi_type := "01001"; -- 0x09
constant ASI_UDATA   : asi_type := "01010"; -- 0x0A
constant ASI_SDATA   : asi_type := "01011"; -- 0x0B
constant ASI_ITAG    : asi_type := "01100"; -- 0x0C
constant ASI_IDATA   : asi_type := "01101"; -- 0x0D
constant ASI_DTAG    : asi_type := "01110"; -- 0x0E
constant ASI_DDATA   : asi_type := "01111"; -- 0x0F
constant ASI_IFLUSH  : asi_type := "10000"; -- 0x10
constant ASI_DFLUSH  : asi_type := "10001"; -- 0x11

constant ASI_FLUSH_PAGE     : std_logic_vector(4 downto 0) := "10000";  -- 0x10 
i/dcache flush page
constant ASI_FLUSH_CTX      : std_logic_vector(4 downto 0) := "10011";  -- 0x13 
i/dcache flush ctx

constant ASI_DCTX           : std_logic_vector(4 downto 0) := "10100";  -- 0x14 
dcache ctx
constant ASI_ICTX           : std_logic_vector(4 downto 0) := "10101";  -- 0x15 
icache ctx

constant ASI_MMUFLUSHPROBE  : std_logic_vector(4 downto 0) := "11000";  -- 0x18 
i/dtlb flush/(probe)
constant ASI_MMUREGS        : std_logic_vector(4 downto 0) := "11001";  -- 0x19 
mmu regs access
constant ASI_MMU_BP         : std_logic_vector(4 downto 0) := "11100";  -- 0x1c 
mmu Bypass 
constant ASI_MMU_DIAG       : std_logic_vector(4 downto 0) := "11101";  -- 0x1d 
mmu diagnostic 
--constant ASI_MMU_DSU        : std_logic_vector(4 downto 0) := "11111";  -- 
0x1f mmu diagnostic 

constant ASI_MMUSNOOP_DTAG  : std_logic_vector(4 downto 0) := "11110";  -- 0x1e 
mmusnoop physical dtag 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]