1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 .macro LOAD_GUEST_SEGMENTS
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 #define XCHG_SR(n) lwz r9, (SVCPU_SR+(n*4))(r3); \
31 mtsr n, r9
32
33 XCHG_SR(0)
34 XCHG_SR(1)
35 XCHG_SR(2)
36 XCHG_SR(3)
37 XCHG_SR(4)
38 XCHG_SR(5)
39 XCHG_SR(6)
40 XCHG_SR(7)
41 XCHG_SR(8)
42 XCHG_SR(9)
43 XCHG_SR(10)
44 XCHG_SR(11)
45 XCHG_SR(12)
46 XCHG_SR(13)
47 XCHG_SR(14)
48 XCHG_SR(15)
49
50
51
52 #define KVM_KILL_BAT(n, reg) \
53 mtspr SPRN_IBAT##n##U,reg; \
54 mtspr SPRN_IBAT##n##L,reg; \
55 mtspr SPRN_DBAT##n##U,reg; \
56 mtspr SPRN_DBAT##n##L,reg; \
57
58 li r9, 0
59 KVM_KILL_BAT(0, r9)
60 KVM_KILL_BAT(1, r9)
61 KVM_KILL_BAT(2, r9)
62 KVM_KILL_BAT(3, r9)
63
64 .endm
65
66
67
68
69
70
71
72 .macro LOAD_HOST_SEGMENTS
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 #define KVM_LOAD_BAT(n, reg, RA, RB) \
93 lwz RA,(n*16)+0(reg); \
94 lwz RB,(n*16)+4(reg); \
95 mtspr SPRN_IBAT##n##U,RA; \
96 mtspr SPRN_IBAT##n##L,RB; \
97 lwz RA,(n*16)+8(reg); \
98 lwz RB,(n*16)+12(reg); \
99 mtspr SPRN_DBAT##n##U,RA; \
100 mtspr SPRN_DBAT##n##L,RB; \
101
102 lis r9, BATS@ha
103 addi r9, r9, BATS@l
104 tophys(r9, r9)
105 KVM_LOAD_BAT(0, r9, r10, r11)
106 KVM_LOAD_BAT(1, r9, r10, r11)
107 KVM_LOAD_BAT(2, r9, r10, r11)
108 KVM_LOAD_BAT(3, r9, r10, r11)
109
110
111
112
113
114 li r0, 4
115 mtctr r0
116 LOAD_REG_IMMEDIATE(r3, 0x20000000 | (0x111 * 0xc))
117 lis r4, 0xc000
118 3: mtsrin r3, r4
119 addi r3, r3, 0x111
120 addis r4, r4, 0x1000
121 bdnz 3b
122
123
124
125
126 tophys(r4, r2)
127 lwz r4, MM(r4)
128 tophys(r4, r4)
129
130 bl switch_mmu_context
131
132 .endm