diff --git a/defs.h b/defs.h index d1b49d06..e3afc58e 100644 --- a/defs.h +++ b/defs.h @@ -2093,6 +2093,7 @@ struct size_table { /* stash of commonly-used sizes */ long hrtimer_base; long tnt; long trace_print_flags; + long task_struct_flags; }; struct array_table { diff --git a/symbols.c b/symbols.c index 7a3f260e..c8f6ff19 100644 --- a/symbols.c +++ b/symbols.c @@ -10088,6 +10088,7 @@ dump_offset_table(char *spec, ulong makestruct) SIZE(page_cache_bucket)); fprintf(fp, " pt_regs: %ld\n", SIZE(pt_regs)); fprintf(fp, " task_struct: %ld\n", SIZE(task_struct)); + fprintf(fp, " task_struct_flags: %ld\n", SIZE(task_struct_flags)); fprintf(fp, " thread_info: %ld\n", SIZE(thread_info)); fprintf(fp, " softirq_state: %ld\n", SIZE(softirq_state)); diff --git a/task.c b/task.c index 7b01951c..0743993a 100644 --- a/task.c +++ b/task.c @@ -249,6 +249,7 @@ task_init(void) MEMBER_OFFSET_INIT(task_struct_active_mm, "task_struct", "active_mm"); MEMBER_OFFSET_INIT(task_struct_next_run, "task_struct", "next_run"); MEMBER_OFFSET_INIT(task_struct_flags, "task_struct", "flags"); + MEMBER_SIZE_INIT(task_struct_flags, "task_struct", "flags"); MEMBER_OFFSET_INIT(task_struct_pidhash_next, "task_struct", "pidhash_next"); MEMBER_OFFSET_INIT(task_struct_pgrp, "task_struct", "pgrp"); @@ -5266,8 +5267,15 @@ task_flags(ulong task) fill_task_struct(task); - flags = tt->last_task_read ? - ULONG(tt->task_struct + OFFSET(task_struct_flags)) : 0; + if (tt->last_task_read) { + if (SIZE(task_struct_flags) == sizeof(unsigned int)) + flags = UINT(tt->task_struct + + OFFSET(task_struct_flags)); + else + flags = ULONG(tt->task_struct + + OFFSET(task_struct_flags)); + } else + flags = 0; return flags; }