Revision 932a6909 exec-all.h
b/exec-all.h | ||
---|---|---|
187 | 187 |
static inline void tb_set_jmp_target1(unsigned long jmp_addr, unsigned long addr) |
188 | 188 |
{ |
189 | 189 |
uint32_t val, *ptr; |
190 |
long disp = addr - jmp_addr; |
|
190 | 191 |
|
191 |
/* patch the branch destination */ |
|
192 | 192 |
ptr = (uint32_t *)jmp_addr; |
193 | 193 |
val = *ptr; |
194 |
val = (val & ~0x03fffffc) | ((addr - jmp_addr) & 0x03fffffc); |
|
195 |
*ptr = val; |
|
194 |
|
|
195 |
if ((disp << 6) >> 6 != disp) { |
|
196 |
uint16_t *p1; |
|
197 |
|
|
198 |
p1 = (uint16_t *) ptr; |
|
199 |
*ptr = (val & ~0x03fffffc) | 4; |
|
200 |
p1[3] = addr >> 16; |
|
201 |
p1[5] = addr & 0xffff; |
|
202 |
} else { |
|
203 |
/* patch the branch destination */ |
|
204 |
val = (val & ~0x03fffffc) | (disp & 0x03fffffc); |
|
205 |
*ptr = val; |
|
206 |
} |
|
196 | 207 |
/* flush icache */ |
197 | 208 |
asm volatile ("dcbst 0,%0" : : "r"(ptr) : "memory"); |
198 | 209 |
asm volatile ("sync" : : : "memory"); |
Also available in: Unified diff