ia64/xen-unstable

view xen/include/asm-x86/rwlock.h @ 15812:86a154e1ef5d

[HVM] Shadow: don't shadow the p2m table.
For HVM vcpus with paging disabled, we used to shadow the p2m table,
and skip the p2m lookup to go from gfn to mfn. Instead, we now
provide a simple pagetable that gives a one-to-one mapping of 4GB, and
shadow that, making the translations from gfn to mfn via the p2m.
This removes the paging-disabled special-case code from the shadow
fault handler, and allows us to expand the p2m interface, since all HVM
translations now go through the same p2m lookups.
Signed-off-by: Tim Deegan <Tim.Deegan@xensource.com>
author Tim Deegan <Tim.Deegan@xensource.com>
date Fri Aug 31 11:06:22 2007 +0100 (2007-08-31)
parents 94a63704b6c4
children 7989e3999e83
line source
1 /* include/asm-x86/rwlock.h
2 *
3 * Helpers used by both rw spinlocks and rw semaphores.
4 *
5 * Based in part on code from semaphore.h and
6 * spinlock.h Copyright 1996 Linus Torvalds.
7 *
8 * Copyright 1999 Red Hat, Inc.
9 *
10 * Written by Benjamin LaHaise.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version
15 * 2 of the License, or (at your option) any later version.
16 */
17 #ifndef _ASM_X86_RWLOCK_H
18 #define _ASM_X86_RWLOCK_H
20 #define RW_LOCK_BIAS 0x01000000
21 #define RW_LOCK_BIAS_STR "0x01000000"
23 #define __build_read_lock_ptr(rw, helper) \
24 asm volatile(LOCK "subl $1,(%0)\n\t" \
25 "js 2f\n" \
26 "1:\n" \
27 ".section .text.lock,\"ax\"\n" \
28 "2:\tcall " helper "\n\t" \
29 "jmp 1b\n" \
30 ".previous" \
31 ::"a" (rw) : "memory")
33 #define __build_read_lock_const(rw, helper) \
34 asm volatile(LOCK "subl $1,%0\n\t" \
35 "js 2f\n" \
36 "1:\n" \
37 ".section .text.lock,\"ax\"\n" \
38 "2:\tpush %%"__OP"ax\n\t" \
39 "lea %0,%%"__OP"ax\n\t" \
40 "call " helper "\n\t" \
41 "pop %%"__OP"ax\n\t" \
42 "jmp 1b\n" \
43 ".previous" \
44 :"=m" (*(volatile int *)rw) : : "memory")
46 #define __build_read_lock(rw, helper) do { \
47 if (__builtin_constant_p(rw)) \
48 __build_read_lock_const(rw, helper); \
49 else \
50 __build_read_lock_ptr(rw, helper); \
51 } while (0)
53 #define __build_write_lock_ptr(rw, helper) \
54 asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
55 "jnz 2f\n" \
56 "1:\n" \
57 ".section .text.lock,\"ax\"\n" \
58 "2:\tcall " helper "\n\t" \
59 "jmp 1b\n" \
60 ".previous" \
61 ::"a" (rw) : "memory")
63 #define __build_write_lock_const(rw, helper) \
64 asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
65 "jnz 2f\n" \
66 "1:\n" \
67 ".section .text.lock,\"ax\"\n" \
68 "2:\tpush %%"__OP"ax\n\t" \
69 "lea %0,%%"__OP"ax\n\t" \
70 "call " helper "\n\t" \
71 "pop %%"__OP"ax\n\t" \
72 "jmp 1b\n" \
73 ".previous" \
74 :"=m" (*(volatile int *)rw) : : "memory")
76 #define __build_write_lock(rw, helper) do { \
77 if (__builtin_constant_p(rw)) \
78 __build_write_lock_const(rw, helper); \
79 else \
80 __build_write_lock_ptr(rw, helper); \
81 } while (0)
83 #endif