12874c5fdSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-or-later */
265ca668fSCyril Bur/*
365ca668fSCyril Bur * Copyright 2015, Cyril Bur, IBM Corp.
465ca668fSCyril Bur */
565ca668fSCyril Bur
615ec3997SSimon Guo#include "basic_asm.h"
715ec3997SSimon Guo#include "vsx_asm.h"
865ca668fSCyril Bur
965ca668fSCyril Bur#long check_vsx(vector int *r3);
1065ca668fSCyril Bur#This function wraps storeing VSX regs to the end of an array and a
1165ca668fSCyril Bur#call to a comparison function in C which boils down to a memcmp()
1265ca668fSCyril BurFUNC_START(check_vsx)
1365ca668fSCyril Bur	PUSH_BASIC_STACK(32)
1465ca668fSCyril Bur	std	r3,STACK_FRAME_PARAM(0)(sp)
1565ca668fSCyril Bur	addi r3, r3, 16 * 12 #Second half of array
1665ca668fSCyril Bur	bl store_vsx
1765ca668fSCyril Bur	ld r3,STACK_FRAME_PARAM(0)(sp)
1865ca668fSCyril Bur	bl vsx_memcmp
1965ca668fSCyril Bur	POP_BASIC_STACK(32)
2065ca668fSCyril Bur	blr
2165ca668fSCyril BurFUNC_END(check_vsx)
2265ca668fSCyril Bur
2365ca668fSCyril Bur# int preempt_vmx(vector int *varray, int *threads_starting,
2465ca668fSCyril Bur#                 int *running);
2565ca668fSCyril Bur# On starting will (atomically) decrement threads_starting as a signal
2665ca668fSCyril Bur# that the VMX have been loaded with varray. Will proceed to check the
2765ca668fSCyril Bur# validity of the VMX registers while running is not zero.
2865ca668fSCyril BurFUNC_START(preempt_vsx)
2965ca668fSCyril Bur	PUSH_BASIC_STACK(512)
3065ca668fSCyril Bur	std r3,STACK_FRAME_PARAM(0)(sp) # vector int *varray
3165ca668fSCyril Bur	std r4,STACK_FRAME_PARAM(1)(sp) # int *threads_starting
3265ca668fSCyril Bur	std r5,STACK_FRAME_PARAM(2)(sp) # int *running
3365ca668fSCyril Bur
3465ca668fSCyril Bur	bl load_vsx
3565ca668fSCyril Bur	nop
3665ca668fSCyril Bur
3765ca668fSCyril Bur	sync
3865ca668fSCyril Bur	# Atomic DEC
3965ca668fSCyril Bur	ld r3,STACK_FRAME_PARAM(1)(sp)
4065ca668fSCyril Bur1:	lwarx r4,0,r3
4165ca668fSCyril Bur	addi r4,r4,-1
4265ca668fSCyril Bur	stwcx. r4,0,r3
4365ca668fSCyril Bur	bne- 1b
4465ca668fSCyril Bur
4565ca668fSCyril Bur2:	ld r3,STACK_FRAME_PARAM(0)(sp)
4665ca668fSCyril Bur	bl check_vsx
4765ca668fSCyril Bur	nop
4865ca668fSCyril Bur	cmpdi r3,0
4965ca668fSCyril Bur	bne 3f
5065ca668fSCyril Bur	ld r4,STACK_FRAME_PARAM(2)(sp)
5165ca668fSCyril Bur	ld r5,0(r4)
5265ca668fSCyril Bur	cmpwi r5,0
5365ca668fSCyril Bur	bne 2b
5465ca668fSCyril Bur
5565ca668fSCyril Bur3:	POP_BASIC_STACK(512)
5665ca668fSCyril Bur	blr
5765ca668fSCyril BurFUNC_END(preempt_vsx)
58