531 |
page_unprotect(addr); |
page_unprotect(addr); |
532 |
} |
} |
533 |
} |
} |
534 |
|
|
535 |
|
/* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr < |
536 |
|
tb[1].tc_ptr. Return NULL if not found */ |
537 |
|
TranslationBlock *tb_find_pc(unsigned long tc_ptr) |
538 |
|
{ |
539 |
|
int m_min, m_max, m; |
540 |
|
unsigned long v; |
541 |
|
TranslationBlock *tb; |
542 |
|
|
543 |
|
if (nb_tbs <= 0) |
544 |
|
return NULL; |
545 |
|
if (tc_ptr < (unsigned long)code_gen_buffer || |
546 |
|
tc_ptr >= (unsigned long)code_gen_ptr) |
547 |
|
return NULL; |
548 |
|
/* binary search (cf Knuth) */ |
549 |
|
m_min = 0; |
550 |
|
m_max = nb_tbs - 1; |
551 |
|
while (m_min <= m_max) { |
552 |
|
m = (m_min + m_max) >> 1; |
553 |
|
tb = &tbs[m]; |
554 |
|
v = (unsigned long)tb->tc_ptr; |
555 |
|
if (v == tc_ptr) |
556 |
|
return tb; |
557 |
|
else if (tc_ptr < v) { |
558 |
|
m_max = m - 1; |
559 |
|
} else { |
560 |
|
m_min = m + 1; |
561 |
|
} |
562 |
|
} |
563 |
|
return &tbs[m_max]; |
564 |
|
} |