[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