Page MenuHomeFreeBSD

libthr: Use kern.stacktop for thread stack calculation.
Needs ReviewPublic

Authored by dgr_semihalf.com on Fri, Sep 10, 6:14 AM.

Details

Reviewers
mw
kib
emaste
imp
cy
Summary

Use the new kern.stacktop sysctl to retrieve the address of stack top
instead of kern.usrstack. kern.usrstack does not have any knowledge
of the stack gap, so this can cause problems with thread stacks.
Using kern.stacktop sysctl should fix most of those problems.
kern.usrstack is used as a fallback when kern.stacktop cannot be read.

Rename usrstack variables to stacktop to reflect this change.

Fixes problems with firefox and thunderbird not starting with
stack gap enabled.

Diff Detail

Lint
Lint Skipped
Unit
Unit Tests Skipped

Event Timeline

dgr_semihalf.com created this revision.
lib/libthr/thread/thr_init.c
469

People will need to remember to installkernel before installworld (as documented). Supporting both for a period of time may avoid POLA with mismatching kernel and userland, i.e. check for stacktop first and if that fails check for usrstack. like this?

mib[1] = KERN_STACKTOP;
len = sizeof (_stacktop);
if (sysctl(mib, 2, &_stacktop, &len, NULL, 0) == -1) {
        mib[1] = KERN_USRSTACK;
        if (sysctl(mib, 2, &_stacktop, &len, NULL, 0) == -1)
                PANIC("Cannot get kern.stacktop from sysctl");
}
dgr_semihalf.com edited the summary of this revision. (Show Details)

Add kern.usrstack fallback if kern.stacktop was not found.

Additionally, change sizeof(mib) / sizeof(mib[0]) to nitems() macro in singlethread_map_stacks_exec() function.