aboutsummaryrefslogtreecommitdiffstats
path: root/xen/include/asm-arm/vfp.h
blob: 9477916a5301a305bdc706bc581f56616045ccad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#ifndef __ARM_VFP_H_
#define __ARM_VFP_H_

#include <xen/types.h>

#define FPEXC_EN (1u << 30)

/* Save and restore FP state.
 * Ought to be using the new vmrs/vmsr names, but older binutils has a
 * bug where it only allows them to target fpscr (and not, say, fpexc). */
#define READ_FP(reg) ({                                 \
    uint32_t val;                                       \
    asm volatile ("fmrx %0, fp" #reg : "=r" (val));     \
    val; })

#define WRITE_FP(reg, val) do {                         \
    asm volatile ("fmxr fp" #reg ", %0" : : "r" (val)); \
} while (0)


/* Start-of-day: Turn on VFP */
static inline void enable_vfp(void)
{
    WRITE_FP(exc, READ_FP(exc) | FPEXC_EN);
}

#endif
/*
 * Local variables:
 * mode: C
 * c-file-style: "BSD"
 * c-basic-offset: 4
 * indent-tabs-mode: nil
 * End:
 */