sys: Switch td_kstack from vm_offset_t to char *

Effort:		CHERI upstreaming
Reviewed by:	kib
Sponsored by:	AFRL, DARPA
Pull Request:	https://github.com/freebsd/freebsd-src/pull/2068
This commit is contained in:
John Baldwin committed 2026-04-23 13:05:54 -04:00
1 parent 8a0ff500d7
commit fe2957f591
29 files changed
+65 -65

No files matched your search

+4 -4
View File
@@ -1365,10 +1365,10 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
/* Init basic tunables, hz etc */
init_param1();
thread0.td_kstack = physfree - kernphys + KERNSTART;
thread0.td_kstack = (char *)physfree - kernphys + KERNSTART;
thread0.td_kstack_pages = kstack_pages;
kstack0_sz = thread0.td_kstack_pages * PAGE_SIZE;
bzero((void *)thread0.td_kstack, kstack0_sz);
bzero(thread0.td_kstack, kstack0_sz);
physfree += kstack0_sz;
/*
@@ -1584,7 +1584,7 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
fpuinit();
/* make an initial tss so cpu can get interrupt stack on syscall! */
rsp0 = thread0.td_md.md_stack_base;
rsp0 = (uintptr_t)thread0.td_md.md_stack_base;
/* Ensure the stack is aligned to 16 bytes */
rsp0 = STACKALIGN(rsp0);
PCPU_PTR(common_tss)->tss_rsp0 = rsp0;
@@ -1621,7 +1621,7 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
TSEXIT();
/* Location of kernel stack for locore */
return (thread0.td_md.md_stack_base);
return ((uintptr_t)thread0.td_md.md_stack_base);
}
void
+1 -1
View File
@@ -75,7 +75,7 @@ struct mdthread {
register_t md_efirt_tmp; /* (k) */
int md_efirt_dis_pf; /* (k) */
struct pcb md_pcb;
vm_offset_t md_stack_base;
void *md_stack_base;
void *md_usr_fpu_save;
};
+4 -4
View File
@@ -13,16 +13,16 @@
#define GET_STACK_USAGE(total, used) do { \
struct thread *td = curthread; \
(total) = td->td_kstack_pages * PAGE_SIZE; \
(used) = (char *)td->td_kstack + \
td->td_kstack_pages * PAGE_SIZE - \
(used) = td->td_kstack + td->td_kstack_pages * PAGE_SIZE - \
(char *)&td; \
} while (0)
static __inline bool
kstack_contains(struct thread *td, vm_offset_t va, size_t len)
{
return (va >= td->td_kstack && va + len >= va &&
va + len <= td->td_kstack + td->td_kstack_pages * PAGE_SIZE);
return (va >= (vm_offset_t)td->td_kstack && va + len >= va &&
va + len <= (vm_offset_t)td->td_kstack + td->td_kstack_pages *
PAGE_SIZE);
}
#endif /* _SYS_PROC_H_ */
+3 -3
View File
@@ -205,7 +205,7 @@ cpu_startup(void *dummy)
bufinit();
vm_pager_bufferinit();
pcb->pcb_regs.sf_sp = (u_int)thread0.td_kstack +
pcb->pcb_regs.sf_sp = (uintptr_t)thread0.td_kstack +
USPACE_SVC_STACK_TOP;
pmap_set_pcb_pagedir(kernel_pmap, pcb);
}
@@ -373,7 +373,7 @@ pcpu0_init(void)
* Initialize proc0
*/
static void
init_proc0(vm_offset_t kstack)
init_proc0(void *kstack)
{
proc_linkup0(&proc0, &thread0);
thread0.td_kstack = kstack;
@@ -622,7 +622,7 @@ initarm(struct arm_boot_params *abp)
*/
/* Set stack for exception handlers */
undefined_init();
init_proc0(kernelstack);
init_proc0((void *)kernelstack);
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
enable_interrupts(PSR_A);
pmap_bootstrap(0);
+4 -4
View File
@@ -69,15 +69,15 @@ void unwind_module_unloaded(struct linker_file *);
#define GET_STACK_USAGE(total, used) do { \
struct thread *td = curthread; \
(total) = td->td_kstack_pages * PAGE_SIZE - sizeof(struct pcb); \
(used) = td->td_kstack + (total) - (vm_offset_t)&td; \
(used) = td->td_kstack + (total) - (char *)&td; \
} while (0)
static __inline bool
kstack_contains(struct thread *td, vm_offset_t va, size_t len)
{
return (va >= td->td_kstack && va + len >= va &&
va + len <= td->td_kstack + td->td_kstack_pages * PAGE_SIZE -
sizeof(struct pcb));
return (va >= (vm_offset_t)td->td_kstack && va + len >= va &&
va + len <= (vm_offset_t)td->td_kstack + td->td_kstack_pages *
PAGE_SIZE - sizeof(struct pcb));
}
#endif /* _SYS_PROC_H_ */
+1 -1
View File
@@ -428,7 +428,7 @@ makectx(struct trapframe *tf, struct pcb *pcb)
}
static void
init_proc0(vm_offset_t kstack)
init_proc0(void *kstack)
{
struct pcpu *pcpup;
+1 -1
View File
@@ -31,7 +31,7 @@
struct arm64_bootparams {
vm_offset_t modulep;
vm_offset_t kern_stack;
void *kern_stack;
vm_paddr_t kern_ttbr0;
int boot_el; /* EL the kernel booted from */
int pad;
+4 -4
View File
@@ -44,15 +44,15 @@ bool unwind_frame(struct thread *, struct unwind_state *);
#define GET_STACK_USAGE(total, used) do { \
struct thread *td = curthread; \
(total) = td->td_kstack_pages * PAGE_SIZE - sizeof(struct pcb); \
(used) = td->td_kstack + (total) - (vm_offset_t)&td; \
(used) = td->td_kstack + (total) - (char *)&td; \
} while (0)
static __inline bool
kstack_contains(struct thread *td, vm_offset_t va, size_t len)
{
return (va >= td->td_kstack && va + len >= va &&
va + len <= td->td_kstack + td->td_kstack_pages * PAGE_SIZE -
sizeof(struct pcb));
return (va >= (vm_offset_t)td->td_kstack && va + len >= va &&
va + len <= (vm_offset_t)td->td_kstack + td->td_kstack_pages *
PAGE_SIZE - sizeof(struct pcb));
}
#endif /* _SYS_PROC_H_ */
+2 -2
View File
@@ -358,8 +358,8 @@ DB_SHOW_COMMAND(thread, db_show_thread)
if (td->td_name[0] != '\0')
db_printf(" name: %s\n", td->td_name);
db_printf(" pcb: %p\n", td->td_pcb);
db_printf(" stack: %p-%p\n", (void *)td->td_kstack,
(void *)(td->td_kstack + td->td_kstack_pages * PAGE_SIZE - 1));
db_printf(" stack: %p-%p\n", td->td_kstack,
td->td_kstack + td->td_kstack_pages * PAGE_SIZE - 1);
db_printf(" flags: %#x ", td->td_flags);
db_printf(" pflags: %#x\n", td->td_pflags);
db_printf(" state: ");
+1 -1
View File
@@ -84,7 +84,7 @@ db_show_threads(db_expr_t addr, bool hasaddr, db_expr_t cnt, char *mod)
thr = kdb_thr_first();
while (!db_pager_quit && thr != NULL) {
db_printf(" %6ld (%p) (stack %p) ", (long)thr->td_tid, thr,
(void *)thr->td_kstack);
thr->td_kstack);
prev_jb = kdb_jmpbuf(jb);
if (setjmp(jb) == 0) {
if (db_trace_thread(thr, 1) != 0)
+3 -3
View File
@@ -1387,7 +1387,7 @@ init386(int first)
vm_offset_t addend;
size_t ucode_len;
thread0.td_kstack = proc0kstack;
thread0.td_kstack = (char *)proc0kstack;
thread0.td_kstack_pages = TD0_KSTACK_PAGES;
/*
@@ -1499,8 +1499,8 @@ init386(int first)
PCPU_SET(fsgs_gdt, &gdt[GUFS_SEL].sd);
/* Initialize the tss (except for the final esp0) early for vm86. */
common_tss0.tss_esp0 = thread0.td_kstack + thread0.td_kstack_pages *
PAGE_SIZE - VM86_STACK_SPACE;
common_tss0.tss_esp0 = (vm_offset_t)thread0.td_kstack +
thread0.td_kstack_pages * PAGE_SIZE - VM86_STACK_SPACE;
common_tss0.tss_ss0 = GSEL(GDATA_SEL, SEL_KPL);
common_tss0.tss_ioopt = sizeof(struct i386tss) << 16;
gsel_tss = GSEL(GPROC0_SEL, SEL_KPL);
+1 -1
View File
@@ -201,7 +201,7 @@ trap_check_kstack(void)
if (stk >= PMAP_TRM_MIN_ADDRESS)
panic("td %p stack %#x in trampoline", td, stk);
if (!kstack_contains(td, stk, 0))
panic("td %p stack %#x not in kstack VA %#x %d",
panic("td %p stack %#x not in kstack VA %p %d",
td, stk, td->td_kstack, td->td_kstack_pages);
}
#endif
+2 -2
View File
@@ -87,7 +87,7 @@ _Static_assert(__OFFSETOF_MONITORBUF == offsetof(struct pcpu, pc_monitorbuf),
union savefpu *
get_pcb_user_save_td(struct thread *td)
{
vm_offset_t p;
char *p;
p = td->td_kstack + td->td_kstack_pages * PAGE_SIZE -
roundup2(cpu_max_ext_state_size, XSAVE_AREA_ALIGN);
@@ -108,7 +108,7 @@ get_pcb_user_save_pcb(struct pcb *pcb)
struct pcb *
get_pcb_td(struct thread *td)
{
vm_offset_t p;
char *p;
p = td->td_kstack + td->td_kstack_pages * PAGE_SIZE -
roundup2(cpu_max_ext_state_size, XSAVE_AREA_ALIGN) -
+2 -2
View File
@@ -12,14 +12,14 @@
/* Get the current kernel thread stack usage. */
#define GET_STACK_USAGE(total, used) do { \
struct thread *td = curthread; \
(total) = (vm_offset_t)get_pcb_td(td) - td->td_kstack; \
(total) = (char *)get_pcb_td(td) - td->td_kstack; \
(used) = (vm_offset_t)get_pcb_td(td) - (vm_offset_t)&td; \
} while (0)
static __inline bool
kstack_contains(struct thread *td, vm_offset_t va, size_t len)
{
return (va >= td->td_kstack && va + len >= va &&
return (va >= (vm_offset_t)td->td_kstack && va + len >= va &&
va + len <= (vm_offset_t)get_pcb_td(td));
}
+1 -1
View File
@@ -1327,7 +1327,7 @@ fill_kinfo_thread(struct thread *td, struct kinfo_proc *kp, int preferthread)
kp->ki_tid = td->td_tid;
kp->ki_numthreads = p->p_numthreads;
kp->ki_pcb = td->td_pcb;
kp->ki_kstack = (void *)td->td_kstack;
kp->ki_kstack = td->td_kstack;
kp->ki_slptime = (ticks - td->td_slptick) / hz;
kp->ki_pri.pri_class = td->td_pri_class;
kp->ki_pri.pri_user = td->td_user_pri;
+5 -5
View File
@@ -466,7 +466,7 @@ thread_init(void *mem, int size, int flags)
td->td_turnstile = turnstile_alloc();
EVENTHANDLER_DIRECT_INVOKE(thread_init, td);
umtx_thread_init(td);
td->td_kstack = 0;
td->td_kstack = NULL;
td->td_sel = NULL;
return (0);
}
@@ -791,7 +791,7 @@ thread_alloc(int pages)
tid = tid_alloc();
td = uma_zalloc(thread_zone, M_WAITOK);
KASSERT(td->td_kstack == 0, ("thread_alloc got thread with kstack"));
KASSERT(td->td_kstack == NULL, ("thread_alloc got thread with kstack"));
if (!vm_thread_new(td, pages)) {
uma_zfree(thread_zone, td);
tid_free(tid);
@@ -810,8 +810,8 @@ thread_alloc(int pages)
int
thread_recycle(struct thread *td, int pages)
{
if (td->td_kstack == 0 || td->td_kstack_pages != pages) {
if (td->td_kstack != 0)
if (td->td_kstack == NULL || td->td_kstack_pages != pages) {
if (td->td_kstack != NULL)
vm_thread_dispose(td);
if (!vm_thread_new(td, pages))
return (ENOMEM);
@@ -834,7 +834,7 @@ thread_free_batched(struct thread *td)
cpuset_rel(td->td_cpuset);
td->td_cpuset = NULL;
cpu_thread_free(td);
if (td->td_kstack != 0)
if (td->td_kstack != NULL)
vm_thread_dispose(td);
callout_drain(&td->td_slpcallout);
/*
+2 -2
View File
@@ -297,8 +297,8 @@ kasan_mark(const void *addr, size_t size, size_t redzsize, uint8_t code)
void
kasan_thread_alloc(struct thread *td)
{
if (td->td_kstack != 0) {
kasan_mark((void *)td->td_kstack, ptoa(td->td_kstack_pages),
if (td->td_kstack != NULL) {
kasan_mark(td->td_kstack, ptoa(td->td_kstack_pages),
ptoa(td->td_kstack_pages), 0);
}
}
+2 -2
View File
@@ -461,8 +461,8 @@ kmsan_thread_alloc(struct thread *td)
__builtin_memset(mtd, 0, sizeof(*mtd));
mtd->ctx = 0;
if (td->td_kstack != 0)
kmsan_mark((void *)td->td_kstack, ptoa(td->td_kstack_pages),
if (td->td_kstack != NULL)
kmsan_mark(td->td_kstack, ptoa(td->td_kstack_pages),
KMSAN_STATE_UNINIT);
td->td_kmsan = mtd;
+1 -1
View File
@@ -962,7 +962,7 @@ moea_bootstrap(vm_offset_t kernelstart, vm_offset_t kernelend)
va = virtual_avail + KSTACK_GUARD_PAGES * PAGE_SIZE;
virtual_avail = va + kstack_pages * PAGE_SIZE;
CTR2(KTR_PMAP, "moea_bootstrap: kstack0 at %#x (%#x)", pa, va);
thread0.td_kstack = va;
thread0.td_kstack = (char *)va;
thread0.td_kstack_pages = kstack_pages;
for (i = 0; i < kstack_pages; i++) {
moea_kenter(va, pa);
+1 -1
View File
@@ -1184,7 +1184,7 @@ moea64_late_bootstrap(vm_offset_t kernelstart, vm_offset_t kernelend)
va = virtual_avail + KSTACK_GUARD_PAGES * PAGE_SIZE;
virtual_avail = va + kstack_pages * PAGE_SIZE;
CTR2(KTR_PMAP, "moea64_bootstrap: kstack0 at %#x (%#x)", pa, va);
thread0.td_kstack = va;
thread0.td_kstack = (char *)va;
thread0.td_kstack_pages = kstack_pages;
for (i = 0; i < kstack_pages; i++) {
moea64_kenter(va, pa);
+1 -1
View File
@@ -2083,7 +2083,7 @@ mmu_radix_late_bootstrap(vm_offset_t start, vm_offset_t end)
va = virtual_avail + KSTACK_GUARD_PAGES * PAGE_SIZE;
virtual_avail = va + kstack_pages * PAGE_SIZE;
CTR2(KTR_PMAP, "moea64_bootstrap: kstack0 at %#x (%#x)", pa, va);
thread0.td_kstack = va;
thread0.td_kstack = (char *)va;
for (i = 0; i < kstack_pages; i++) {
mmu_radix_kenter(va, pa);
pa += PAGE_SIZE;
+1 -1
View File
@@ -930,7 +930,7 @@ mmu_booke_bootstrap(vm_offset_t start, vm_offset_t kernelend)
/* Enter kstack0 into kernel map, provide guard page */
kstack0 = virtual_avail + KSTACK_GUARD_PAGES * PAGE_SIZE;
thread0.td_kstack = kstack0;
thread0.td_kstack = (char *)kstack0;
thread0.td_kstack_pages = kstack_pages;
debugf("kstack_sz = 0x%08jx\n", (uintmax_t)kstack0_sz);
+4 -4
View File
@@ -39,15 +39,15 @@ extern int end[];
#define GET_STACK_USAGE(total, used) do { \
struct thread *td = curthread; \
(total) = td->td_kstack_pages * PAGE_SIZE - sizeof(struct pcb); \
(used) = td->td_kstack + (total) - (vm_offset_t)&td; \
(used) = td->td_kstack + (total) - (char *)&td; \
} while (0)
static __inline bool
kstack_contains(struct thread *td, vm_offset_t va, size_t len)
{
return (va >= td->td_kstack && va + len >= va &&
va + len <= td->td_kstack + td->td_kstack_pages * PAGE_SIZE -
sizeof(struct pcb));
return (va >= (vm_offset_t)td->td_kstack && va + len >= va &&
va + len <= (vm_offset_t)td->td_kstack + td->td_kstack_pages *
PAGE_SIZE - sizeof(struct pcb));
}
#endif /* _SYS_PROC_H_ */
+1 -1
View File
@@ -37,7 +37,7 @@
struct riscv_bootparams {
vm_offset_t kern_phys; /* Kernel base (physical) addr */
vm_offset_t kern_stack;
void *kern_stack;
vm_offset_t dtbp_phys; /* Device tree blob physical addr */
vm_offset_t modulep; /* loader(8) metadata */
};
+4 -4
View File
@@ -54,15 +54,15 @@ bool unwind_frame(struct thread *, struct unwind_state *);
#define GET_STACK_USAGE(total, used) do { \
struct thread *td = curthread; \
(total) = td->td_kstack_pages * PAGE_SIZE - sizeof(struct pcb); \
(used) = td->td_kstack + (total) - (vm_offset_t)&td; \
(used) = td->td_kstack + (total) - (char *)&td; \
} while (0)
static __inline bool
kstack_contains(struct thread *td, vm_offset_t va, size_t len)
{
return (va >= td->td_kstack && va + len >= va &&
va + len <= td->td_kstack + td->td_kstack_pages * PAGE_SIZE -
sizeof(struct pcb));
return (va >= (vm_offset_t)td->td_kstack && va + len >= va &&
va + len <= (vm_offset_t)td->td_kstack + td->td_kstack_pages *
PAGE_SIZE - sizeof(struct pcb));
}
#endif /* _SYS_PROC_H_ */
+1 -1
View File
@@ -287,7 +287,7 @@ makectx(struct trapframe *tf, struct pcb *pcb)
}
static void
init_proc0(vm_offset_t kstack)
init_proc0(void *kstack)
{
struct pcpu *pcpup;
+1 -1
View File
@@ -61,7 +61,7 @@
static void
cpu_set_pcb_frame(struct thread *td)
{
td->td_pcb = (struct pcb *)((char *)td->td_kstack +
td->td_pcb = (struct pcb *)(td->td_kstack +
td->td_kstack_pages * PAGE_SIZE) - 1;
/*
+1 -1
View File
@@ -367,7 +367,7 @@ struct thread {
/* LP64 hole */
struct callout td_slpcallout; /* (h) Callout for sleep. */
struct trapframe *td_frame; /* (k) */
vm_offset_t td_kstack; /* (a) Kernel VA of kstack. */
char *td_kstack; /* (a) Pointer to kstack. */
u_short td_kstack_pages; /* (a) Size of the kstack. */
u_short td_kstack_domain; /* (a) Domain backing kstack KVA. */
volatile u_int td_critnest; /* (k*) Critical section nest level. */
+6 -6
View File
@@ -540,7 +540,7 @@ vm_thread_new(struct thread *td, int pages)
ks_domain = vm_phys_domain(vtophys(ks));
KASSERT(ks_domain >= 0 && ks_domain < vm_ndomains,
("%s: invalid domain for kstack %p", __func__, (void *)ks));
td->td_kstack = (vm_offset_t)ks;
td->td_kstack = ks;
td->td_kstack_pages = pages;
td->td_kstack_domain = ks_domain;
return (1);
@@ -556,8 +556,8 @@ vm_thread_dispose(struct thread *td)
int pages;
pages = td->td_kstack_pages;
ks = (void *)td->td_kstack;
td->td_kstack = 0;
ks = td->td_kstack;
td->td_kstack = NULL;
td->td_kstack_pages = 0;
td->td_kstack_domain = MAXMEMDOM;
if (pages == kstack_pages) {
@@ -727,8 +727,8 @@ SYSCTL_INT(_debug, OID_AUTO, max_kstack_used, CTLFLAG_RD,
void
intr_prof_stack_use(struct thread *td, struct trapframe *frame)
{
vm_offset_t stack_top;
vm_offset_t current;
char *stack_top;
char *current;
int used, prev_used;
/*
@@ -740,7 +740,7 @@ intr_prof_stack_use(struct thread *td, struct trapframe *frame)
return;
stack_top = td->td_kstack + td->td_kstack_pages * PAGE_SIZE;
current = (vm_offset_t)(uintptr_t)&stack_top;
current = (char *)&stack_top;
/*
* Try to detect if interrupt is using kernel thread stack.