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