Skip to content

Commit be6df66

Browse files
1. fix hook: paging_init with pac 2. fix hook: modify pgtable with PTE_CONT 3. fix kptools: base_cand num error and workflow 4. fix some struct offset resolver
Signed-off-by: Admirepowered <[email protected]> Co-authored-by: NepXIN <[email protected]>
1 parent 362c0b3 commit be6df66

File tree

9 files changed

+140
-35
lines changed

9 files changed

+140
-35
lines changed

.github/workflows/build.yml

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,66 @@ jobs:
219219
allowUpdates: true
220220
replacesArtifacts: true
221221

222+
Build-kptools-windows-msys2:
223+
runs-on: windows-2022
224+
permissions:
225+
contents: write
226+
steps:
227+
- name: Checkout
228+
uses: actions/checkout@v3
229+
- name: Generate version
230+
shell: pwsh
231+
run: |
232+
$MAJOR = (Select-String -Path version -Pattern '#define MAJOR').Line.Split(' ')[2]
233+
$MINOR = (Select-String -Path version -Pattern '#define MINOR').Line.Split(' ')[2]
234+
$PATCH = (Select-String -Path version -Pattern '#define PATCH').Line.Split(' ')[2]
235+
$VERSION = "$MAJOR.$MINOR.$PATCH"
236+
Write-Output "Generated Version: $VERSION"
237+
"VERSION=$VERSION" | Out-File -FilePath $env:GITHUB_ENV -Append
238+
Add-Content -Path $env:GITHUB_OUTPUT -Value "VERSION=$VERSION"
239+
- uses: msys2/setup-msys2@v2
240+
with:
241+
update: true
242+
msystem: ucrt64
243+
path-type: inherit
244+
install: >-
245+
msys/make
246+
msys/gcc
247+
msys/zlib-devel
248+
- name: Copyfile
249+
shell: pwsh
250+
run: |
251+
cp .\kernel\include\preset.h .\tools\
252+
cd tools
253+
(Get-Content -Path "Makefile") -replace '\$\(CC\)', " x86_64-pc-msys-gcc.exe" | Set-Content -Path "Makefile"
254+
(Get-Content -Path "Makefile") -replace '\${CC}', "x86_64-pc-msys-gcc.exe" | Set-Content -Path "Makefile"
255+
- name: build
256+
shell: cmd
257+
run: |
258+
cd tools
259+
msys2 -c 'make'
260+
- name: Showinfo
261+
shell: cmd
262+
run: |
263+
ls C:\a\_temp\
264+
265+
- name: Copyfile2
266+
shell: pwsh
267+
run: |
268+
mkdir .\win
269+
cp .\tools\kptools.exe .\win\kptools-msys2.exe
270+
cp C:\a\_temp\msys64\usr\bin\msys-2.0.dll .\win
271+
cp C:\a\_temp\msys64\usr\bin\msys-z.dll .\win
272+
7z a kptools-msys2-win .\win
273+
- name: Release
274+
uses: ncipollo/[email protected]
275+
with:
276+
token: ${{ secrets.GITHUB_TOKEN }}
277+
tag: ${{ env.VERSION }}
278+
artifacts: |
279+
kptools-msys2-win.7z
280+
allowUpdates: true
281+
replacesArtifacts: true
222282

223283
Build-kptools-mac:
224284
runs-on: macos-latest

kernel/base/fphook.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -221,28 +221,25 @@ void fp_hook(uintptr_t fp_addr, void *replace, void **backup)
221221
{
222222
uint64_t *entry = pgtable_entry_kernel(fp_addr);
223223
uint64_t ori_prot = *entry;
224-
*entry = (ori_prot | PTE_DBM) & ~PTE_RDONLY;
224+
modify_entry_kernel(fp_addr, entry, (ori_prot | PTE_DBM) & ~PTE_RDONLY);
225225
flush_tlb_kernel_page(fp_addr);
226226
*(uintptr_t *)backup = *(uintptr_t *)fp_addr;
227227
*(uintptr_t *)fp_addr = (uintptr_t)replace;
228228
dsb(ish);
229-
*entry = ori_prot;
230-
flush_tlb_kernel_page(fp_addr);
229+
modify_entry_kernel(fp_addr, entry, ori_prot);
231230
}
232231
KP_EXPORT_SYMBOL(fp_hook);
233232

234233
void fp_unhook(uintptr_t fp_addr, void *backup)
235234
{
236235
uint64_t *entry = pgtable_entry_kernel(fp_addr);
237236
uint64_t ori_prot = *entry;
238-
*entry = (ori_prot | PTE_DBM) & ~PTE_RDONLY;
239-
flush_tlb_kernel_page(fp_addr);
237+
modify_entry_kernel(fp_addr, entry, (ori_prot | PTE_DBM) & ~PTE_RDONLY);
240238
*(uintptr_t *)fp_addr = (uintptr_t)backup;
241239
dsb(ish);
242240
isb();
243241
flush_icache_all();
244-
*entry = ori_prot;
245-
flush_tlb_kernel_page(fp_addr);
242+
modify_entry_kernel(fp_addr, entry, ori_prot);
246243
}
247244
KP_EXPORT_SYMBOL(fp_unhook);
248245

kernel/base/hook.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -606,16 +606,14 @@ void hook_install(hook_t *hook)
606606
uint64_t va = hook->origin_addr;
607607
uint64_t *entry = pgtable_entry_kernel(va);
608608
uint64_t ori_prot = *entry;
609-
*entry = (ori_prot | PTE_DBM) & ~PTE_RDONLY;
610-
flush_tlb_kernel_page(va);
609+
modify_entry_kernel(va, entry, (ori_prot | PTE_DBM) & ~PTE_RDONLY);
611610
// todo: cpu_stop_machine
612611
// todo: can use aarch64_insn_patch_text_nosync, aarch64_insn_patch_text directly?
613612
for (int32_t i = 0; i < hook->tramp_insts_num; i++) {
614613
*((uint32_t *)hook->origin_addr + i) = hook->tramp_insts[i];
615614
}
616615
flush_icache_all();
617-
*entry = ori_prot;
618-
flush_tlb_kernel_page(va);
616+
modify_entry_kernel(va, entry, ori_prot);
619617
}
620618
KP_EXPORT_SYMBOL(hook_install);
621619

@@ -624,14 +622,13 @@ void hook_uninstall(hook_t *hook)
624622
uint64_t va = hook->origin_addr;
625623
uint64_t *entry = pgtable_entry_kernel(va);
626624
uint64_t ori_prot = *entry;
627-
*entry = (ori_prot | PTE_DBM) & ~PTE_RDONLY;
625+
modify_entry_kernel(va, entry, (ori_prot | PTE_DBM) & ~PTE_RDONLY);
628626
flush_tlb_kernel_page(va);
629627
for (int32_t i = 0; i < hook->tramp_insts_num; i++) {
630628
*((uint32_t *)hook->origin_addr + i) = hook->origin_insts[i];
631629
}
632630
flush_icache_all();
633-
*entry = ori_prot;
634-
flush_tlb_kernel_page(va);
631+
modify_entry_kernel(va, entry, ori_prot);
635632
}
636633
KP_EXPORT_SYMBOL(hook_uninstall);
637634

kernel/base/setup1.S

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,29 @@ map_prepare:
223223
add x13, x15, x19
224224
// map_data.paging_init_backup = *(uint32_t *)(paging_init_pa);
225225
ldr w12, [x13]
226+
227+
mov w3, #0x201F
228+
movk w3, #0xD503, lsl#16
229+
orr w1, w3, #0x100
230+
mov w2, #0xFFFFFD1F
231+
and w0, w12, w2
232+
// if ((map_data.paging_init_backup & 0xFFFFFD1F) == 0xD503211F)
233+
cmp w0, w1
234+
b.ne .backup
235+
// map_data.paging_init_backup = NOP
236+
mov w12, w3
237+
// uint32_t *p = (uint32_t *)paging_init_pa + 1;
238+
add x11, x13, #4
239+
.cmp_auti:
240+
// while ((*p & 0xFFFFFD1F) != 0xD503211F) ++p;
241+
ldr w0, [x11], #4
242+
and w0, w0, w2
243+
cmp w0, w1
244+
b.ne .cmp_auti
245+
// *p = NOP
246+
stur w3, [x11, #-4]
247+
248+
.backup:
226249
str w12, [x9, #map_paging_init_backup_offset]
227250
dsb ish
228251

kernel/base/start.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,25 @@ uint64_t *pgtable_entry(uint64_t pgd, uint64_t va)
174174
}
175175
KP_EXPORT_SYMBOL(pgtable_entry);
176176

177+
void modify_entry_kernel(uint64_t va, uint64_t *entry, uint64_t value)
178+
{
179+
if (!pte_valid_cont(*entry) && !pte_valid_cont(value)) {
180+
*entry = value;
181+
flush_tlb_kernel_page(va);
182+
return;
183+
}
184+
185+
uint64_t table_pa_mask = (((1ul << (48 - page_shift)) - 1) << page_shift);
186+
uint64_t prot = value & ~table_pa_mask;
187+
uint64_t *p = (uint64_t *)((uintptr_t)entry & ~(sizeof(entry) * CONT_PTES - 1));
188+
for (int i = 0; i < CONT_PTES; ++i, ++p)
189+
*p = (*p & table_pa_mask) | prot;
190+
191+
*entry = value;
192+
va &= CONT_PTE_MASK;
193+
flush_tlb_kernel_range(va, va + CONT_PTES * page_size);
194+
}
195+
177196
static void prot_myself()
178197
{
179198
uint64_t *kpte = pgtable_entry_kernel(kernel_stext_va);

kernel/include/pgtable.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,13 @@
4747
#define PTATTR_RDONLY (1ul << 62) /* AP[2], write note permited at any exception level*/
4848
#define PTATTR_NS (1ul << 63) /* Indicates whether the table identifier is located in Secure PA space */
4949

50+
#define pte_valid_cont(pte) (((pte) & (PTE_VALID | PTE_TABLE_BIT | PTE_CONT)) == (PTE_VALID | PTE_TABLE_BIT | PTE_CONT))
51+
52+
#define CONT_PTE_SHIFT (4 + page_shift)
53+
#define CONT_PTES (1 << (CONT_PTE_SHIFT - page_shift))
54+
#define CONT_PTE_SIZE (CONT_PTES * page_size)
55+
#define CONT_PTE_MASK (~(CONT_PTE_SIZE - 1))
56+
5057
#define mask_ul(h, l) (((~0ul) << (l)) & (~0ul >> (63 - (h))))
5158

5259
#define sev() asm volatile("sev" : : : "memory")
@@ -169,4 +176,6 @@ static inline uint64_t *pgtable_entry_kernel(uint64_t va)
169176
return pgtable_entry(pgd_va, va);
170177
}
171178

179+
void modify_entry_kernel(uint64_t va, uint64_t *entry, uint64_t value);
180+
172181
#endif

kernel/patch/ksyms/execv.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ static void before_execve(hook_fargs3_t *args, void *udata)
3838
unsigned long stack = (unsigned long)get_stack(current);
3939
uintptr_t addr = (uintptr_t)(thread_size + stack);
4040

41-
for (uintptr_t i = addr - sizeof(struct pt_regs) - 0x40; i < addr - 32 * 8; i += 0x10) {
41+
for (uintptr_t i = addr - sizeof(struct pt_regs) - 0x40; i < addr - 32 * 8; i += sizeof(uint32_t)) {
4242
uintptr_t val0 = *(uintptr_t *)i;
4343
uintptr_t val1 = *(uintptr_t *)(i + 0x8);
4444
uintptr_t val2 = *(uintptr_t *)(i + 0x10);

kernel/patch/ksyms/task_cred.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ int resolve_cred_offset()
203203
kernel_cap_t new_cap_e = { 0xff }, new_cap_i = { 0xf }, new_cap_p = { 0xfff };
204204
cap_capset(cred1, cred, &new_cap_e, &new_cap_i, &new_cap_p);
205205

206-
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(kernel_cap_t)) {
206+
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(uint32_t)) {
207207
if (is_bl(i)) continue;
208208
kernel_cap_t cap = *(kernel_cap_t *)((uintptr_t)cred + i);
209209
kernel_cap_t cap1 = *(kernel_cap_t *)((uintptr_t)cred1 + i);
@@ -225,7 +225,7 @@ int resolve_cred_offset()
225225
}
226226

227227
// cap_bset
228-
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(kernel_cap_t)) {
228+
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(uint32_t)) {
229229
if (is_bl(i)) continue;
230230
kernel_cap_t cap1 = *(kernel_cap_t *)((uintptr_t)cred1 + i);
231231
if (cap1.val == effective.val) {
@@ -239,7 +239,7 @@ int resolve_cred_offset()
239239
log_boot(" cap_bset offset: %x\n", cred_offset.cap_bset_offset);
240240

241241
// securebits
242-
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(unsigned)) {
242+
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(uint32_t)) {
243243
if (is_bl(i)) continue;
244244
unsigned *sbitsp = (unsigned *)((uintptr_t)cred + i);
245245
unsigned oribits = *sbitsp;
@@ -257,7 +257,7 @@ int resolve_cred_offset()
257257
log_boot(" securebits offset: %x\n", cred_offset.securebits_offset);
258258

259259
// euid, uid, egid, gid
260-
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(uid_t)) {
260+
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(uint32_t)) {
261261
if (is_bl(i)) continue;
262262
uid_t *uidp = (uid_t *)((uintptr_t)cred + i);
263263
if (*uidp) continue;
@@ -283,7 +283,7 @@ int resolve_cred_offset()
283283
log_boot(" egid offset: %x\n", cred_offset.egid_offset);
284284

285285
// fsuid
286-
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(uid_t)) {
286+
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(uint32_t)) {
287287
if (is_bl(i)) continue;
288288
uid_t *uidp = (uid_t *)((uintptr_t)cred + i);
289289
uid_t backup = *uidp;
@@ -300,7 +300,7 @@ int resolve_cred_offset()
300300

301301
// fsgid
302302
struct cred *new_cred = *(struct cred **)((uintptr_t)task + task_struct_offset.cred_offset);
303-
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(gid_t)) {
303+
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(uint32_t)) {
304304
if (is_bl(i)) continue;
305305
gid_t *gidp = (gid_t *)((uintptr_t)new_cred + i);
306306
gid_t backup = *gidp;
@@ -318,7 +318,7 @@ int resolve_cred_offset()
318318
// suid
319319
raw_syscall3(__NR_setresuid, 0, 0, 1158);
320320
new_cred = *(struct cred **)((uintptr_t)task + task_struct_offset.cred_offset);
321-
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(uid_t)) {
321+
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(uint32_t)) {
322322
if (is_bl(i)) continue;
323323
uid_t *uidp = (uid_t *)((uintptr_t)new_cred + i);
324324
if (*uidp == 1158) {
@@ -333,7 +333,7 @@ int resolve_cred_offset()
333333
// sgid
334334
raw_syscall3(__NR_setresgid, 0, 0, 1158);
335335
new_cred = *(struct cred **)((uintptr_t)task + task_struct_offset.cred_offset);
336-
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(gid_t)) {
336+
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(uint32_t)) {
337337
if (is_bl(i)) continue;
338338
gid_t *uidp = (gid_t *)((uintptr_t)new_cred + i);
339339
if (*uidp == 1158) {
@@ -353,7 +353,7 @@ int resolve_cred_offset()
353353
*(unsigned *)((uintptr_t)new_cred + cred_offset.securebits_offset) = 0;
354354
cap_task_prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_RAISE, 0xf, 0, 0);
355355
new_cred = *(struct cred **)((uintptr_t)task + task_struct_offset.cred_offset);
356-
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(kernel_cap_t)) {
356+
for (int i = 0; i < CRED_MAX_SIZE; i += sizeof(uint32_t)) {
357357
if (is_bl(i)) continue;
358358
kernel_cap_t cap = *(kernel_cap_t *)((uintptr_t)cred + i);
359359
kernel_cap_t new_cap = *(kernel_cap_t *)((uintptr_t)new_cred + i);
@@ -379,7 +379,7 @@ static int find_swapper_comm_offset(uint64_t start, int size)
379379
if (!is_kimg_range(start) || !is_kimg_range(start + size)) return -1;
380380
char swapper_comm[TASK_COMM_LEN] = "swapper";
381381
char swapper_comm_1[TASK_COMM_LEN] = "swapper/0";
382-
for (uint64_t i = start; i < start + size; i += 8) {
382+
for (uint64_t i = start; i < start + size; i += sizeof(uint32_t)) {
383383
if (!lib_strcmp(swapper_comm, (char *)i) || !lib_strcmp(swapper_comm_1, (char *)i)) {
384384
return i - start;
385385
}
@@ -401,7 +401,7 @@ int resolve_task_offset()
401401
int cred_offset_idx = 0;
402402
init_cred = get_task_cred(init_task); // todo: get_task_cred not export
403403
log_boot(" init_cred addr: %llx\n", init_cred);
404-
for (uintptr_t i = (uintptr_t)init_task; i < (uintptr_t)init_task + TASK_STRUCT_MAX_SIZE; i += sizeof(uintptr_t)) {
404+
for (uintptr_t i = (uintptr_t)init_task; i < (uintptr_t)init_task + TASK_STRUCT_MAX_SIZE; i += sizeof(uint32_t)) {
405405
uintptr_t val = *(uintptr_t *)i;
406406
if (val == (uintptr_t)init_cred) {
407407
cred_offset[cred_offset_idx++] = i - (uintptr_t)init_task;
@@ -426,7 +426,7 @@ int resolve_task_offset()
426426

427427
// seccomp
428428
if (kfunc(prctl_get_seccomp)) {
429-
for (uintptr_t i = (uintptr_t)task; i < (uintptr_t)task + TASK_STRUCT_MAX_SIZE; i += sizeof(uintptr_t)) {
429+
for (uintptr_t i = (uintptr_t)task; i < (uintptr_t)task + TASK_STRUCT_MAX_SIZE; i += sizeof(uint32_t)) {
430430
int *modep = (int *)i;
431431
int mode_back = *modep;
432432
if (mode_back) continue;
@@ -443,7 +443,7 @@ int resolve_task_offset()
443443
// active_mm
444444
init_mm = (struct mm_struct *)kallsyms_lookup_name("init_mm");
445445
if (init_mm) {
446-
for (uintptr_t i = (uintptr_t)task; i < (uintptr_t)task + TASK_STRUCT_MAX_SIZE; i += sizeof(uintptr_t)) {
446+
for (uintptr_t i = (uintptr_t)task; i < (uintptr_t)task + TASK_STRUCT_MAX_SIZE; i += sizeof(uint32_t)) {
447447
uintptr_t active_mm = *(uintptr_t *)i;
448448
if (active_mm == (uintptr_t)init_mm) {
449449
task_struct_offset.active_mm_offset = i - (uintptr_t)task;
@@ -516,7 +516,7 @@ int resolve_current()
516516
uint64_t sp_low = sp & ~(tsz - 1);
517517
// uint64_t sp_high = sp_low + tsz; // user_stack_pointer
518518
uint64_t psp = sp_low;
519-
for (; psp < sp_low + THREAD_INFO_MAX_SIZE; psp += 8) {
519+
for (; psp < sp_low + THREAD_INFO_MAX_SIZE; psp += sizeof(uint32_t)) {
520520
if (*(uint64_t *)psp == STACK_END_MAGIC) {
521521
if (psp == sp_low) {
522522
thread_size = tsz;
@@ -544,15 +544,15 @@ int resolve_current()
544544
if (!thread_info_in_task) {
545545
uint64_t thread_info_addr = (uint64_t)current_thread_info_sp();
546546
if (init_task) {
547-
for (uint64_t ptr = thread_info_addr; ptr < thread_info_addr + stack_end_offset; ptr += sizeof(uint64_t)) {
547+
for (uint64_t ptr = thread_info_addr; ptr < thread_info_addr + stack_end_offset; ptr += sizeof(uint32_t)) {
548548
uint64_t pv = *(uint64_t *)ptr;
549549
if (pv == (uint64_t)init_task) {
550550
task_in_thread_info_offset = ptr - thread_info_addr;
551551
break;
552552
}
553553
}
554554
} else { // unlikely
555-
for (uint64_t ptr = thread_info_addr; ptr < thread_info_addr + stack_end_offset; ptr += sizeof(uint64_t)) {
555+
for (uint64_t ptr = thread_info_addr; ptr < thread_info_addr + stack_end_offset; ptr += sizeof(uint32_t)) {
556556
uint64_t pv = *(uint64_t *)ptr;
557557
task_struct_offset.comm_offset = find_swapper_comm_offset(pv, TASK_STRUCT_MAX_SIZE);
558558
if (task_struct_offset.comm_offset > 0) {
@@ -573,7 +573,7 @@ int resolve_current()
573573

574574
// stack,
575575
uint64_t stack_base = (sp & ~(thread_size - 1));
576-
for (uintptr_t i = (uintptr_t)init_task; i < (uintptr_t)init_task + TASK_STRUCT_MAX_SIZE; i += sizeof(uintptr_t)) {
576+
for (uintptr_t i = (uintptr_t)init_task; i < (uintptr_t)init_task + TASK_STRUCT_MAX_SIZE; i += sizeof(uint32_t)) {
577577
uintptr_t val = *(uintptr_t *)i;
578578
if (stack_base == val) {
579579
stack_in_task_offset = i - (uintptr_t)init_task;
@@ -599,7 +599,7 @@ int resolve_mm_struct_offset()
599599
uintptr_t init_mm_addr = (uintptr_t)init_mm;
600600
if (!init_mm_addr) return 0;
601601

602-
for (uintptr_t i = init_mm_addr; i < init_mm_addr + MM_STRUCT_MAX_SIZE; i += sizeof(uintptr_t)) {
602+
for (uintptr_t i = init_mm_addr; i < init_mm_addr + MM_STRUCT_MAX_SIZE; i += sizeof(uint32_t)) {
603603
uint64_t pgd = *(uintptr_t *)i;
604604
if (pgd == phys_to_kimg(pgd_pa)) {
605605
mm_struct_offset.pgd_offset = i - init_mm_addr;

tools/kallsym.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -668,10 +668,10 @@ static int correct_addresses_or_offsets_by_vectors(kallsym_t *info, char *img, i
668668
uint64_t base = uint_unpack(img + info->_approx_addresses_or_offsets_offset, elem_size, info->is_be);
669669
base_cand[0] = base;
670670
if (info->kernel_base) {
671-
base_cand[++base_cand_num] = info->kernel_base;
671+
base_cand[base_cand_num++] = info->kernel_base;
672672
}
673673
if (info->kernel_base != ELF64_KERNEL_MIN_VA) {
674-
base_cand[++base_cand_num] = ELF64_KERNEL_MIN_VA;
674+
base_cand[base_cand_num++] = ELF64_KERNEL_MIN_VA;
675675
}
676676
}
677677

0 commit comments

Comments
 (0)