xref: /qemu/pc-bios/s390-ccw/helper.h (revision f7884164cbe3743c3bd2acc9daf877497fdb5fa3)
11fb3e5cdSJason J. Herne /*
21fb3e5cdSJason J. Herne  * Helper Functions
31fb3e5cdSJason J. Herne  *
41fb3e5cdSJason J. Herne  * Copyright (c) 2019 IBM Corp.
51fb3e5cdSJason J. Herne  *
61fb3e5cdSJason J. Herne  * Author(s): Jason J. Herne <jjherne@us.ibm.com>
71fb3e5cdSJason J. Herne  *
81fb3e5cdSJason J. Herne  * This work is licensed under the terms of the GNU GPL, version 2 or (at
91fb3e5cdSJason J. Herne  * your option) any later version. See the COPYING file in the top-level
101fb3e5cdSJason J. Herne  * directory.
111fb3e5cdSJason J. Herne  */
121fb3e5cdSJason J. Herne 
131fb3e5cdSJason J. Herne #ifndef S390_CCW_HELPER_H
141fb3e5cdSJason J. Herne #define S390_CCW_HELPER_H
151fb3e5cdSJason J. Herne 
161fb3e5cdSJason J. Herne #include "s390-ccw.h"
1712ea90dbSJanosch Frank #include "s390-time.h"
181fb3e5cdSJason J. Herne 
191fb3e5cdSJason J. Herne /* Avoids compiler warnings when casting a pointer to a u32 */
ptr2u32(void * ptr)201fb3e5cdSJason J. Herne static inline uint32_t ptr2u32(void *ptr)
211fb3e5cdSJason J. Herne {
229598c227SJanosch Frank     IPL_assert((uint64_t)ptr <= 0xffffffffull, "ptr2u32: ptr too large");
231fb3e5cdSJason J. Herne     return (uint32_t)(uint64_t)ptr;
241fb3e5cdSJason J. Herne }
251fb3e5cdSJason J. Herne 
261fb3e5cdSJason J. Herne /* Avoids compiler warnings when casting a u32 to a pointer */
u32toptr(uint32_t n)271fb3e5cdSJason J. Herne static inline void *u32toptr(uint32_t n)
281fb3e5cdSJason J. Herne {
291fb3e5cdSJason J. Herne     return (void *)(uint64_t)n;
301fb3e5cdSJason J. Herne }
311fb3e5cdSJason J. Herne 
yield(void)3212ea90dbSJanosch Frank static inline void yield(void)
3312ea90dbSJanosch Frank {
34052b66e7SThomas Huth     asm volatile ("diag %%r0,%%r0,0x44"
3512ea90dbSJanosch Frank                   : :
3612ea90dbSJanosch Frank                   : "memory", "cc");
3712ea90dbSJanosch Frank }
3812ea90dbSJanosch Frank 
sleep(unsigned int seconds)3912ea90dbSJanosch Frank static inline void sleep(unsigned int seconds)
4012ea90dbSJanosch Frank {
41*f7f2f96fSJuan Quintela     unsigned long target = get_time_seconds() + seconds;
4212ea90dbSJanosch Frank 
4312ea90dbSJanosch Frank     while (get_time_seconds() < target) {
4412ea90dbSJanosch Frank         yield();
4512ea90dbSJanosch Frank     }
4612ea90dbSJanosch Frank }
4712ea90dbSJanosch Frank 
481fb3e5cdSJason J. Herne #endif
49