• David Howells's avatar
    FRV: Implement atomic64_t · 00460f41
    David Howells authored
    Implement atomic64_t and its ops for FRV.  Tested with the following patch:
    
    	diff --git a/arch/frv/kernel/setup.c b/arch/frv/kernel/setup.c
    	index 55e4fab..086d50d 100644
    	--- a/arch/frv/kernel/setup.c
    	+++ b/arch/frv/kernel/setup.c
    	@@ -746,6 +746,52 @@ static void __init parse_cmdline_early(char *cmdline)
    
    	 } /* end parse_cmdline_early() */
    
    	+static atomic64_t xxx;
    	+
    	+static void test_atomic64(void)
    	+{
    	+	atomic64_set(&xxx, 0x12300000023LL);
    	+
    	+	mb();
    	+	BUG_ON(atomic64_read(&xxx) != 0x12300000023LL);
    	+	mb();
    	+	if (atomic64_inc_return(&xxx) != 0x12300000024LL)
    	+		BUG();
    	+	mb();
    	+	BUG_ON(atomic64_read(&xxx) != 0x12300000024LL);
    	+	mb();
    	+	if (atomic64_sub_return(0x36900000050LL, &xxx) != -0x2460000002cLL)
    	+		BUG();
    	+	mb();
    	+	BUG_ON(atomic64_read(&xxx) != -0x2460000002cLL);
    	+	mb();
    	+	if (atomic64_dec_return(&xxx) != -0x2460000002dLL)
    	+		BUG();
    	+	mb();
    	+	BUG_ON(atomic64_read(&xxx) != -0x2460000002dLL);
    	+	mb();
    	+	if (atomic64_add_return(0x36800000001LL, &xxx) != 0x121ffffffd4LL)
    	+		BUG();
    	+	mb();
    	+	BUG_ON(atomic64_read(&xxx) != 0x121ffffffd4LL);
    	+	mb();
    	+	if (atomic64_cmpxchg(&xxx, 0x123456789abcdefLL, 0x121ffffffd4LL) != 0x121ffffffd4LL)
    	+		BUG();
    	+	mb();
    	+	BUG_ON(atomic64_read(&xxx) != 0x121ffffffd4LL);
    	+	mb();
    	+	if (atomic64_cmpxchg(&xxx, 0x121ffffffd4LL, 0x123456789abcdefLL) != 0x121ffffffd4LL)
    	+		BUG();
    	+	mb();
    	+	BUG_ON(atomic64_read(&xxx) != 0x123456789abcdefLL);
    	+	mb();
    	+	if (atomic64_xchg(&xxx, 0xabcdef123456789LL) != 0x123456789abcdefLL)
    	+		BUG();
    	+	mb();
    	+	BUG_ON(atomic64_read(&xxx) != 0xabcdef123456789LL);
    	+	mb();
    	+}
    	+
    	 /*****************************************************************************/
    	 /*
    	  *
    	@@ -845,6 +891,8 @@ void __init setup_arch(char **cmdline_p)
    	 //	asm volatile("movgs %0,timerd" :: "r"(10000000));
    	 //	__set_HSR(0, __get_HSR(0) | HSR0_ETMD);
    
    	+	test_atomic64();
    	+
    	 } /* end setup_arch() */
    
    	 #if 0
    
    Note that this doesn't cover all the trivial wrappers, but does cover all the
    substantial implementations.
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    00460f41
atomic-ops.S 5.21 KB