cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

locks.S (2144B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * locks.S: SMP low-level lock primitives on Sparc.
      4 *
      5 * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
      6 * Copyright (C) 1998 Anton Blanchard (anton@progsoc.uts.edu.au)
      7 * Copyright (C) 1998 Jakub Jelinek   (jj@ultra.linux.cz)
      8 */
      9
     10#include <asm/ptrace.h>
     11#include <asm/psr.h>
     12#include <asm/smp.h>
     13#include <asm/spinlock.h>
     14#include <asm/export.h>
     15
     16	.text
     17	.align	4
     18
     19	/* Read/writer locks, as usual this is overly clever to make it
     20	 * as fast as possible.
     21	 */
     22
     23	/* caches... */
     24___rw_read_enter_spin_on_wlock:
     25	orcc	%g2, 0x0, %g0
     26	be,a	___rw_read_enter
     27	 ldstub	[%g1 + 3], %g2
     28	b	___rw_read_enter_spin_on_wlock
     29	 ldub	[%g1 + 3], %g2
     30___rw_read_try_spin_on_wlock:
     31	andcc	%g2, 0xff, %g0
     32	be,a	___rw_read_try
     33	 ldstub	[%g1 + 3], %g2
     34	xnorcc	%g2, 0x0, %o0	/* if g2 is ~0, set o0 to 0 and bugger off */
     35	bne,a	___rw_read_enter_spin_on_wlock
     36	 ld	[%g1], %g2
     37	retl
     38	 mov	%g4, %o7
     39___rw_read_exit_spin_on_wlock:
     40	orcc	%g2, 0x0, %g0
     41	be,a	___rw_read_exit
     42	 ldstub	[%g1 + 3], %g2
     43	b	___rw_read_exit_spin_on_wlock
     44	 ldub	[%g1 + 3], %g2
     45___rw_write_enter_spin_on_wlock:
     46	orcc	%g2, 0x0, %g0
     47	be,a	___rw_write_enter
     48	 ldstub	[%g1 + 3], %g2
     49	b	___rw_write_enter_spin_on_wlock
     50	 ld	[%g1], %g2
     51
     52	.globl	___rw_read_enter
     53EXPORT_SYMBOL(___rw_read_enter)
     54___rw_read_enter:
     55	orcc	%g2, 0x0, %g0
     56	bne,a	___rw_read_enter_spin_on_wlock
     57	 ldub	[%g1 + 3], %g2
     58	ld	[%g1], %g2
     59	add	%g2, 1, %g2
     60	st	%g2, [%g1]
     61	retl
     62	 mov	%g4, %o7
     63
     64	.globl	___rw_read_exit
     65EXPORT_SYMBOL(___rw_read_exit)
     66___rw_read_exit:
     67	orcc	%g2, 0x0, %g0
     68	bne,a	___rw_read_exit_spin_on_wlock
     69	 ldub	[%g1 + 3], %g2
     70	ld	[%g1], %g2
     71	sub	%g2, 0x1ff, %g2
     72	st	%g2, [%g1]
     73	retl
     74	 mov	%g4, %o7
     75
     76	.globl	___rw_read_try
     77EXPORT_SYMBOL(___rw_read_try)
     78___rw_read_try:
     79	orcc	%g2, 0x0, %g0
     80	bne	___rw_read_try_spin_on_wlock
     81	 ld	[%g1], %g2
     82	add	%g2, 1, %g2
     83	st	%g2, [%g1]
     84	set	1, %o1
     85	retl
     86	 mov	%g4, %o7
     87
     88	.globl	___rw_write_enter
     89EXPORT_SYMBOL(___rw_write_enter)
     90___rw_write_enter:
     91	orcc	%g2, 0x0, %g0
     92	bne	___rw_write_enter_spin_on_wlock
     93	 ld	[%g1], %g2
     94	andncc	%g2, 0xff, %g0
     95	bne,a	___rw_write_enter_spin_on_wlock
     96	 stb	%g0, [%g1 + 3]
     97	retl
     98	 mov	%g4, %o7