Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / include / ppcp7 / cpu.h
1 /******************************************************************************
2  * Copyright (c) 2004, 2008 IBM Corporation
3  * All rights reserved.
4  * This program and the accompanying materials
5  * are made available under the terms of the BSD License
6  * which accompanies this distribution, and is available at
7  * http://www.opensource.org/licenses/bsd-license.php
8  *
9  * Contributors:
10  *     IBM Corporation - initial implementation
11  *****************************************************************************/
12
13 #ifndef __CPU_H
14 #define __CPU_H
15
16 /* Used in boot_abort.S, will need something better for KVM */
17 #define HSPRG0  304
18
19 /* XXX FIXME: Can be more efficient, no dcbst nor loop needed on P7 */
20 /* This macro uses r0 */
21 #define FLUSH_CACHE(r, n)       add     n, n, r; \
22                                 addi    n, n, 127; \
23                                 rlwinm  r, r, 0,0,24; \
24                                 rlwinm  n, n, 0,0,24; \
25                                 sub     n, n, r; \
26                                 srwi    n, n, 7; \
27                                 mtctr   n; \
28                         0:      dcbst   0, r; \
29                                 sync; \
30                                 icbi    0, r; \
31                                 sync; \
32                                 isync; \
33                                 addi    r, r, 128; \
34                                 bdnz    0b;
35
36 #ifndef __ASSEMBLER__
37 #define STRINGIFY(x...) #x
38 #define EXPAND(x) STRINGIFY(x)
39
40 static inline void flush_cache(void* r, long n)
41 {
42         asm volatile(EXPAND(FLUSH_CACHE(%0, %1))
43                      : "+r"(r), "+r"(n)
44                      :: "memory", "cc", "r0", "ctr");
45 }
46
47 static inline void eieio(void)
48 {
49         asm volatile ("eieio":::"memory");
50 }
51
52 static inline void barrier(void)
53 {
54         asm volatile("" : : : "memory");
55 }
56 #define cpu_relax() barrier()
57
58 static inline void sync(void)
59 {
60         asm volatile ("sync" ::: "memory");
61 }
62 #define mb() sync()
63
64 #endif /* __ASSEMBLER__ */
65
66 #endif