|
@@ -32,6 +32,7 @@
|
|
#include "symbol.h"
|
|
#include "symbol.h"
|
|
#include "util.h"
|
|
#include "util.h"
|
|
#include "debug.h"
|
|
#include "debug.h"
|
|
|
|
+#include "asm/bug.h"
|
|
|
|
|
|
extern int
|
|
extern int
|
|
UNW_OBJ(dwarf_search_unwind_table) (unw_addr_space_t as,
|
|
UNW_OBJ(dwarf_search_unwind_table) (unw_addr_space_t as,
|
|
@@ -580,43 +581,33 @@ static unw_accessors_t accessors = {
|
|
|
|
|
|
int unwind__prepare_access(struct thread *thread)
|
|
int unwind__prepare_access(struct thread *thread)
|
|
{
|
|
{
|
|
- unw_addr_space_t addr_space;
|
|
|
|
-
|
|
|
|
if (callchain_param.record_mode != CALLCHAIN_DWARF)
|
|
if (callchain_param.record_mode != CALLCHAIN_DWARF)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
- addr_space = unw_create_addr_space(&accessors, 0);
|
|
|
|
- if (!addr_space) {
|
|
|
|
|
|
+ thread->addr_space = unw_create_addr_space(&accessors, 0);
|
|
|
|
+ if (!thread->addr_space) {
|
|
pr_err("unwind: Can't create unwind address space.\n");
|
|
pr_err("unwind: Can't create unwind address space.\n");
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
}
|
|
}
|
|
|
|
|
|
- unw_set_caching_policy(addr_space, UNW_CACHE_GLOBAL);
|
|
|
|
- thread__set_priv(thread, addr_space);
|
|
|
|
-
|
|
|
|
|
|
+ unw_set_caching_policy(thread->addr_space, UNW_CACHE_GLOBAL);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
void unwind__flush_access(struct thread *thread)
|
|
void unwind__flush_access(struct thread *thread)
|
|
{
|
|
{
|
|
- unw_addr_space_t addr_space;
|
|
|
|
-
|
|
|
|
if (callchain_param.record_mode != CALLCHAIN_DWARF)
|
|
if (callchain_param.record_mode != CALLCHAIN_DWARF)
|
|
return;
|
|
return;
|
|
|
|
|
|
- addr_space = thread__priv(thread);
|
|
|
|
- unw_flush_cache(addr_space, 0, 0);
|
|
|
|
|
|
+ unw_flush_cache(thread->addr_space, 0, 0);
|
|
}
|
|
}
|
|
|
|
|
|
void unwind__finish_access(struct thread *thread)
|
|
void unwind__finish_access(struct thread *thread)
|
|
{
|
|
{
|
|
- unw_addr_space_t addr_space;
|
|
|
|
-
|
|
|
|
if (callchain_param.record_mode != CALLCHAIN_DWARF)
|
|
if (callchain_param.record_mode != CALLCHAIN_DWARF)
|
|
return;
|
|
return;
|
|
|
|
|
|
- addr_space = thread__priv(thread);
|
|
|
|
- unw_destroy_addr_space(addr_space);
|
|
|
|
|
|
+ unw_destroy_addr_space(thread->addr_space);
|
|
}
|
|
}
|
|
|
|
|
|
static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
|
|
static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
|
|
@@ -639,7 +630,9 @@ static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
|
|
* unwind itself.
|
|
* unwind itself.
|
|
*/
|
|
*/
|
|
if (max_stack - 1 > 0) {
|
|
if (max_stack - 1 > 0) {
|
|
- addr_space = thread__priv(ui->thread);
|
|
|
|
|
|
+ WARN_ONCE(!ui->thread, "WARNING: ui->thread is NULL");
|
|
|
|
+ addr_space = ui->thread->addr_space;
|
|
|
|
+
|
|
if (addr_space == NULL)
|
|
if (addr_space == NULL)
|
|
return -1;
|
|
return -1;
|
|
|
|
|