xref: /kvm-unit-tests/lib/s390x/asm/float.h (revision eb5a1bbab00619256b76177e7a88cfe05834b026)
16c9f99dfSJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */
22d0d5f41SDavid Hildenbrand /*
32d0d5f41SDavid Hildenbrand  * Copyright (c) 2018 Red Hat Inc
42d0d5f41SDavid Hildenbrand  *
52d0d5f41SDavid Hildenbrand  * Authors:
62d0d5f41SDavid Hildenbrand  *  David Hildenbrand <david@redhat.com>
72d0d5f41SDavid Hildenbrand  */
8*eb5a1bbaSCornelia Huck #ifndef _ASMS390X_FLOAT_H_
9*eb5a1bbaSCornelia Huck #define _ASMS390X_FLOAT_H_
102d0d5f41SDavid Hildenbrand 
112d0d5f41SDavid Hildenbrand static inline void set_fpc(uint32_t fpc)
122d0d5f41SDavid Hildenbrand {
132d0d5f41SDavid Hildenbrand 	asm volatile("	lfpc	%0\n" : : "m"(fpc) );
142d0d5f41SDavid Hildenbrand }
152d0d5f41SDavid Hildenbrand 
162d0d5f41SDavid Hildenbrand static inline uint32_t get_fpc(void)
172d0d5f41SDavid Hildenbrand {
182d0d5f41SDavid Hildenbrand 	uint32_t fpc;
192d0d5f41SDavid Hildenbrand 
202d0d5f41SDavid Hildenbrand 	asm volatile("	stfpc	%0\n" : "=m"(fpc));
212d0d5f41SDavid Hildenbrand 
222d0d5f41SDavid Hildenbrand 	return fpc;
232d0d5f41SDavid Hildenbrand }
242d0d5f41SDavid Hildenbrand 
25dfe993b0SThomas Huth static inline uint8_t get_fpc_dxc(void)
262d0d5f41SDavid Hildenbrand {
272d0d5f41SDavid Hildenbrand 	return get_fpc() >> 8;
282d0d5f41SDavid Hildenbrand }
292d0d5f41SDavid Hildenbrand 
302d0d5f41SDavid Hildenbrand static inline void set_fpc_dxc(uint8_t dxc)
312d0d5f41SDavid Hildenbrand {
322d0d5f41SDavid Hildenbrand 	uint32_t fpc = get_fpc();
332d0d5f41SDavid Hildenbrand 
342d0d5f41SDavid Hildenbrand 	fpc = (fpc & ~0xff00) | ((uint32_t)dxc) << 8;
352d0d5f41SDavid Hildenbrand 
362d0d5f41SDavid Hildenbrand 	set_fpc(fpc);
372d0d5f41SDavid Hildenbrand }
382d0d5f41SDavid Hildenbrand 
392d0d5f41SDavid Hildenbrand static inline void afp_enable(void)
402d0d5f41SDavid Hildenbrand {
412d0d5f41SDavid Hildenbrand 	ctl_set_bit(0, 63 - 45);
422d0d5f41SDavid Hildenbrand }
432d0d5f41SDavid Hildenbrand 
442d0d5f41SDavid Hildenbrand static inline void afp_disable(void)
452d0d5f41SDavid Hildenbrand {
462d0d5f41SDavid Hildenbrand 	ctl_clear_bit(0, 63 - 45);
472d0d5f41SDavid Hildenbrand }
482d0d5f41SDavid Hildenbrand 
492d0d5f41SDavid Hildenbrand #endif
50