Skip to content

Commit c5fdbb5

Browse files
authored
osi_linux: Support kernel version 6.7 (#1429)
1 parent b50fe5d commit c5fdbb5

3 files changed

Lines changed: 23 additions & 7 deletions

File tree

panda/plugins/osi_linux/default_profile.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ target_ptr_t default_get_current_task_struct(CPUState *cpu)
4343
// We need to expose that as a part of the OSI config - See issue #651
4444
target_ptr_t task_thread_info = kernel_sp & ~(0x2000 -1);
4545

46+
//for kernel versions >= 5.18.0
47+
if (PROFILE_KVER_GE(ki, 5, 18, 0)) {
48+
return task_thread_info;
49+
}
50+
4651
current_task_addr=task_thread_info+0xC;
4752

4853
//because some kernel versions use both per_cpu variables AND access the task_struct
@@ -60,6 +65,13 @@ target_ptr_t default_get_current_task_struct(CPUState *cpu)
6065
current_task_addr = get_id(cpu); // HWID returned by hw_proc_id is the cached r28 value
6166
OG_printf("Got current task struct at " TARGET_FMT_lx "\n", current_task_addr);
6267

68+
//because some kernel versions use both per_cpu variables AND access the task_struct
69+
//via the thread_info struct, the default call to struct_get with the per_cpu_offset_0_addr can be incorrect
70+
err = struct_get(cpu, &ts, current_task_addr, 0);
71+
assert(err == struct_get_ret_t::SUCCESS && "failed to get current task struct");
72+
fixupendian2(ts);
73+
return ts;
74+
6375
#else // x86/64
6476
current_task_addr = ki.task.current_task_addr;
6577
#endif

panda/plugins/osi_linux/utils/kernelinfo/kernelinfo_read.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ int read_kernelinfo(gchar const *file, gchar const *group, struct kernelinfo *ki
145145
READ_INFO_INT(ki, fs.f_vfsmnt_offset, gerr, err.fs, &errbmp);
146146
}
147147

148-
READ_INFO_INT(ki, task.thread_group_offset, gerr, err.task, &errbmp);
148+
OPTIONAL_READ_INFO_INT(ki, task.thread_group_offset, gerr, err.task, &errbmp);
149149
READ_INFO_INT(ki, task.pid_offset, gerr, err.task, &errbmp);
150150
READ_INFO_INT(ki, task.tgid_offset, gerr, err.task, &errbmp);
151151
READ_INFO_INT(ki, task.mm_offset, gerr, err.task, &errbmp);
@@ -157,7 +157,7 @@ int read_kernelinfo(gchar const *file, gchar const *group, struct kernelinfo *ki
157157

158158
/* read mm information */
159159
READ_INFO_INT(ki, mm.size, gerr, err.mm, &errbmp);
160-
READ_INFO_INT(ki, mm.mmap_offset, gerr, err.mm, &errbmp);
160+
OPTIONAL_READ_INFO_INT(ki, mm.mmap_offset, gerr, err.mm, &errbmp);
161161
READ_INFO_INT(ki, mm.pgd_offset, gerr, err.mm, &errbmp);
162162
READ_INFO_INT(ki, mm.arg_start_offset, gerr, err.mm, &errbmp);
163163
READ_INFO_INT(ki, mm.start_brk_offset, gerr, err.mm, &errbmp);
@@ -169,7 +169,7 @@ int read_kernelinfo(gchar const *file, gchar const *group, struct kernelinfo *ki
169169
READ_INFO_INT(ki, vma.vm_mm_offset, gerr, err.vma, &errbmp);
170170
READ_INFO_INT(ki, vma.vm_start_offset, gerr, err.vma, &errbmp);
171171
READ_INFO_INT(ki, vma.vm_end_offset, gerr, err.vma, &errbmp);
172-
READ_INFO_INT(ki, vma.vm_next_offset, gerr, err.vma, &errbmp);
172+
OPTIONAL_READ_INFO_INT(ki, vma.vm_next_offset, gerr, err.vma, &errbmp);
173173
READ_INFO_INT(ki, vma.vm_file_offset, gerr, err.vma, &errbmp);
174174
READ_INFO_INT(ki, vma.vm_flags_offset, gerr, err.vma, &errbmp);
175175

panda/plugins/osi_linux/utils/kernelinfo_gdb/extract_kernelinfo.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ def invoke(self, arg, from_tty):
3737
versions = release.split(".")
3838
# version.c can have a bunch of junk - just extract a number
3939
versions[2] = re.search("\d+",versions[2]).group(0)
40+
versions = tuple(int(ver) for ver in versions)
4041
print(f"version.a = {versions[0]}",file=file_out)
4142
print(f"version.b = {versions[1]}",file=file_out)
4243
print(f"version.c = {versions[2]}",file=file_out)
@@ -75,7 +76,8 @@ def invoke(self, arg, from_tty):
7576
print_offset("struct task_struct", "pid", "task");
7677
print_offset("struct task_struct", "tgid", "task");
7778
print_offset("struct task_struct", "group_leader", "task");
78-
print_offset("struct task_struct", "thread_group", "task");
79+
if versions < (6, 7, 0):
80+
print_offset("struct task_struct", "thread_group", "task");
7981
print_offset("struct task_struct", "real_parent", "task");
8082
print_offset("struct task_struct", "parent", "task");
8183
print_offset("struct task_struct", "mm", "task");
@@ -91,7 +93,8 @@ def invoke(self, arg, from_tty):
9193
print_offset("struct cred", "euid", "cred");
9294
print_offset("struct cred", "egid", "cred");
9395
print_size("struct mm_struct", "size", "mm");
94-
print_offset("struct mm_struct", "mmap", "mm");
96+
if versions < (6, 1, 0):
97+
print_offset("struct mm_struct", "mmap", "mm");
9598
print_offset("struct mm_struct", "pgd", "mm");
9699
print_offset("struct mm_struct", "arg_start", "mm");
97100
print_offset("struct mm_struct", "start_brk", "mm");
@@ -102,7 +105,8 @@ def invoke(self, arg, from_tty):
102105
print_offset("struct vm_area_struct", "vm_mm", "vma");
103106
print_offset("struct vm_area_struct", "vm_start", "vma");
104107
print_offset("struct vm_area_struct", "vm_end", "vma");
105-
print_offset("struct vm_area_struct", "vm_next", "vma");
108+
if versions < (6, 1, 0):
109+
print_offset("struct vm_area_struct", "vm_next", "vma");
106110
print_offset("struct vm_area_struct", "vm_flags", "vma");
107111
print_offset("struct vm_area_struct", "vm_file", "vma");
108112

@@ -128,7 +132,7 @@ def invoke(self, arg, from_tty):
128132
print_offset("struct dentry", "d_op", "path");
129133
print_offset("struct dentry_operations", "d_dname", "path");
130134
print_offset("struct vfsmount", "mnt_root", "path");
131-
if int(versions[0]) >= 3:
135+
if versions[0] >= 3:
132136
# fields in struct mount
133137
print_offset_from_member("struct mount", "mnt", "mnt_parent", "path");
134138
print_offset_from_member("struct mount", "mnt", "mnt_mountpoint", "path");

0 commit comments

Comments
 (0)