Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

release-1.7: Backports for 1.7.2 #43667

Merged
merged 25 commits into from
Jan 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
d82a907
fix `current_exceptions` docstring and annotate arguments (#41897)
aviatesk Aug 16, 2021
e13f8bf
`Base.runtests`: set a temporary Pkg depot path (#42358)
DilumAluthge Sep 23, 2021
6619d65
win32: Fix SEH frame sentinel (#43570)
Keno Dec 28, 2021
118d245
`Base.runtests`: unset `JULIA_PROJECT` and `JULIA_LOAD_PATH` (#43575)
DilumAluthge Dec 28, 2021
f4a0c7c
Change `shm_open()` calling ABI on aarch64 Darwin (#43516)
staticfloat Dec 31, 2021
3b7e9f0
Missing package add prompt: Restrict which exprs to search in (#43457)
IanButterworth Jan 1, 2022
04d16b2
move enabling fast TLS from `jl_load_repl` to `jl_load_libjulia_inter…
KristofferC Jan 4, 2022
85fc5c9
Use a valid atomic ordering in docstring (#43643)
tkf Jan 4, 2022
04f6a38
Do not fail if fastpath for TLS can't be found
vchuravy Jan 6, 2022
2c65083
fix atomic `getfield` with boundcheck on interpreter (#43602)
aviatesk Jan 5, 2022
aa342bc
Lift expensive Regex construction from DateFormat method body.
Sacha0 Jan 4, 2022
c7110e0
Resolve instability from `reducedim_init` (#43467)
N5N3 Jan 6, 2022
e528136
Fix Base.StackTraces.lookup(C_NULL - 1) on macOS 12 (#43612)
dnadlinger Jan 7, 2022
aca122f
add const keyword to broadcasted AndAnd (#43483)
Dec 20, 2021
6043be5
Fix sparse array `setindex(::Int, ::Vector)` (#43678)
dkarrasch Jan 7, 2022
4280bc4
Fix (add|set)env to keep currently set dir for the command, fixes #42…
fredrikekre Dec 1, 2021
cecf27a
fix #25678: return matters for generated functions (#40778)
simeonschaub Aug 24, 2021
f476e1d
late-gc-lowering: Prevent infinite recursion (#42445)
Keno Oct 2, 2021
fea2e84
Spell out ~0L literal (#43579)
Keno Dec 29, 2021
65a11e1
run a temp cleanup after the precompilation step (#43761)
KristofferC Jan 12, 2022
9e5ad01
Fix #43004 by commenting out broken throw tests (#43739)
mkitti Jan 13, 2022
f5d02a1
Use `GlobalRef` of `Core.CodeInfo` in `@generated` (#43823)
devmotion Jan 16, 2022
d52235f
macOS: workaround a dyld/libunwind deadlock issue since 12.1
vtjnash Jan 7, 2022
3582fd7
macOS: extend the workaround to cover the dyld/exc_server deadlock is…
vtjnash Jan 12, 2022
5e045a1
[LateLowerGC] Change undef FCA into zeroinit (#43867)
vchuravy Jan 20, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion base/broadcast.jl
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ function Broadcasted{Style}(f::F, args::Args, axes=nothing) where {Style, F, Arg
end

struct AndAnd end
andand = AndAnd()
const andand = AndAnd()
broadcasted(::AndAnd, a, b) = broadcasted((a, b) -> a && b, a, b)
function broadcasted(::AndAnd, a, bc::Broadcasted)
bcf = flatten(bc)
Expand Down
10 changes: 6 additions & 4 deletions base/cmd.jl
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ byteenv(env::Union{AbstractVector{Pair{T,V}}, Tuple{Vararg{Pair{T,V}}}}) where {
String[cstr(k*"="*string(v)) for (k,v) in env]

"""
setenv(command::Cmd, env; dir="")
setenv(command::Cmd, env; dir)

Set environment variables to use when running the given `command`. `env` is either a
dictionary mapping strings to strings, an array of strings of the form `"var=val"`, or
Expand All @@ -239,13 +239,15 @@ existing environment, create `env` through `copy(ENV)` and then setting `env["va
as desired, or use [`addenv`](@ref).

The `dir` keyword argument can be used to specify a working directory for the command.
`dir` defaults to the currently set `dir` for `command` (which is the current working
directory if not specified already).

See also [`Cmd`](@ref), [`addenv`](@ref), [`ENV`](@ref), [`pwd`](@ref).
"""
setenv(cmd::Cmd, env; dir="") = Cmd(cmd; env=byteenv(env), dir=dir)
setenv(cmd::Cmd, env::Pair{<:AbstractString}...; dir="") =
setenv(cmd::Cmd, env; dir=cmd.dir) = Cmd(cmd; env=byteenv(env), dir=dir)
setenv(cmd::Cmd, env::Pair{<:AbstractString}...; dir=cmd.dir) =
setenv(cmd, env; dir=dir)
setenv(cmd::Cmd; dir="") = Cmd(cmd; dir=dir)
setenv(cmd::Cmd; dir=cmd.dir) = Cmd(cmd; dir=dir)

"""
addenv(command::Cmd, env...; inherit::Bool = true)
Expand Down
4 changes: 2 additions & 2 deletions base/error.jl
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ struct ExceptionStack <: AbstractArray{Any,1}
end

"""
current_exceptions(task=current_task(); [inclue_bt=true])
current_exceptions(task::Task=current_task(); [backtrace::Bool=true])

Get the stack of exceptions currently being handled. For nested catch blocks
there may be more than one current exception in which case the most recently
Expand All @@ -145,7 +145,7 @@ uncaught exceptions.
This function went by the experimental name `catch_stack()` in Julia
1.1–1.6, and had a plain Vector-of-tuples as a return type.
"""
function current_exceptions(task=current_task(); backtrace=true)
function current_exceptions(task::Task=current_task(); backtrace::Bool=true)
raw = ccall(:jl_get_excstack, Any, (Any,Cint,Cint), task, backtrace, typemax(Cint))::Vector{Any}
formatted = Any[]
stride = backtrace ? 3 : 1
Expand Down
8 changes: 6 additions & 2 deletions base/expr.jl
Original file line number Diff line number Diff line change
Expand Up @@ -441,12 +441,16 @@ macro generated(f)
if isa(f, Expr) && (f.head === :function || is_short_function_def(f))
body = f.args[2]
lno = body.args[1]
tmp = gensym("tmp")
return Expr(:escape,
Expr(f.head, f.args[1],
Expr(:block,
lno,
Expr(:if, Expr(:generated),
body,
# https://github.com/JuliaLang/julia/issues/25678
Expr(:block,
:(local $tmp = $body),
:(if $tmp isa $(GlobalRef(Core, :CodeInfo)); return $tmp; else $tmp; end)),
Expr(:block,
Expr(:meta, :generated_only),
Expr(:return, nothing))))))
Expand All @@ -464,7 +468,7 @@ Mark `var` or `ex` as being performed atomically, if `ex` is a supported express

@atomic a.b.x = new
@atomic a.b.x += addend
@atomic :acquire_release a.b.x = new
@atomic :release a.b.x = new
@atomic :acquire_release a.b.x += addend

Perform the store operation expressed on the right atomically and return the
Expand Down
6 changes: 3 additions & 3 deletions base/reducedim.jl
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ for (f1, f2, initval, typeextreme) in ((:min, :max, :Inf, :typemax), (:max, :min

if isempty(A1)
# If the slice is empty just return non-view version as the initial array
return copy(A1)
return map(f, A1)
else
# otherwise use the min/max of the first slice as initial value
v0 = mapreduce(f, $f2, A1)
Expand All @@ -148,9 +148,9 @@ for (f1, f2, initval, typeextreme) in ((:min, :max, :Inf, :typemax), (:max, :min
Tr = v0 isa T ? T : typeof(v0)

# but NaNs and missing need to be avoided as initial values
if (v0 == v0) === false
if v0 isa Number && isnan(v0)
# v0 is NaN
v0 = $initval
v0 = oftype(v0, $initval)
elseif isunordered(v0)
# v0 is missing or a third-party unordered value
Tnm = nonmissingtype(Tr)
Expand Down
3 changes: 3 additions & 0 deletions base/util.jl
Original file line number Diff line number Diff line change
Expand Up @@ -622,6 +622,9 @@ function runtests(tests = ["all"]; ncores::Int = ceil(Int, Sys.CPU_THREADS::Int
seed !== nothing && push!(tests, "--seed=0x$(string(seed % UInt128, base=16))") # cast to UInt128 to avoid a minus sign
ENV2 = copy(ENV)
ENV2["JULIA_CPU_THREADS"] = "$ncores"
ENV2["JULIA_DEPOT_PATH"] = mktempdir(; cleanup = true)
delete!(ENV2, "JULIA_LOAD_PATH")
delete!(ENV2, "JULIA_PROJECT")
try
run(setenv(`$(julia_cmd()) $(joinpath(Sys.BINDIR::String,
Base.DATAROOTDIR, "julia", "test", "runtests.jl")) $tests`, ENV2))
Expand Down
28 changes: 12 additions & 16 deletions cli/loader_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,18 @@ __attribute__((constructor)) void jl_load_libjulia_internal(void) {
}
(*jl_exported_func_addrs[symbol_idx]) = addr;
}
// Next, if we're on Linux/FreeBSD, set up fast TLS.
#if !defined(_OS_WINDOWS_) && !defined(_OS_DARWIN_)
void (*jl_pgcstack_setkey)(void*, void*(*)(void)) = lookup_symbol(libjulia_internal, "jl_pgcstack_setkey");
if (jl_pgcstack_setkey == NULL) {
jl_loader_print_stderr("ERROR: Cannot find jl_pgcstack_setkey() function within libjulia-internal!\n");
exit(1);
}
void *fptr = lookup_symbol(RTLD_DEFAULT, "jl_get_pgcstack_static");
void *(*key)(void) = lookup_symbol(RTLD_DEFAULT, "jl_pgcstack_addr_static");
if (fptr != NULL && key != NULL)
jl_pgcstack_setkey(fptr, key);
#endif

// jl_options must be initialized very early, in case an embedder sets some
// values there before calling jl_init
Expand All @@ -199,22 +211,6 @@ JL_DLLEXPORT int jl_load_repl(int argc, char * argv[]) {
exit(1);
}
}
// Next, if we're on Linux/FreeBSD, set up fast TLS.
#if !defined(_OS_WINDOWS_) && !defined(_OS_DARWIN_)
void (*jl_pgcstack_setkey)(void*, void*(*)(void)) = lookup_symbol(libjulia_internal, "jl_pgcstack_setkey");
if (jl_pgcstack_setkey == NULL) {
jl_loader_print_stderr("ERROR: Cannot find jl_pgcstack_setkey() function within libjulia-internal!\n");
exit(1);
}
void *fptr = lookup_symbol(RTLD_DEFAULT, "jl_get_pgcstack_static");
void *(*key)(void) = lookup_symbol(RTLD_DEFAULT, "jl_pgcstack_addr_static");
if (fptr == NULL || key == NULL) {
jl_loader_print_stderr("ERROR: Cannot find jl_get_pgcstack_static(), must define this symbol within calling executable!\n");
exit(1);
}
jl_pgcstack_setkey(fptr, key);
#endif

// Load the repl entrypoint symbol and jump into it!
int (*entrypoint)(int, char **) = (int (*)(int, char **))lookup_symbol(libjulia_internal, "jl_repl_entrypoint");
if (entrypoint == NULL) {
Expand Down
1 change: 1 addition & 0 deletions contrib/generate_precompile.jl
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,7 @@ generate_precompile_statements()

# As a last step in system image generation,
# remove some references to build time environment for a more reproducible build.
Base.Filesystem.temp_cleanup_purge(force=true)
@eval Base PROGRAM_FILE = ""
@eval Sys begin
BINDIR = ""
Expand Down
1 change: 1 addition & 0 deletions src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ endif
CLANG_LDFLAGS := $(LLVM_LDFLAGS)
ifeq ($(OS), Darwin)
CLANG_LDFLAGS += -Wl,-undefined,dynamic_lookup
OSLIBS += $(SRCDIR)/mach_dyld_atfork.tbd
endif

COMMON_LIBPATHS := -L$(build_libdir) -L$(build_shlibdir)
Expand Down
6 changes: 3 additions & 3 deletions src/builtins.c
Original file line number Diff line number Diff line change
Expand Up @@ -861,9 +861,9 @@ JL_CALLABLE(jl_f_getfield)
enum jl_memory_order order = jl_memory_order_unspecified;
JL_NARGS(getfield, 2, 4);
if (nargs == 4) {
JL_TYPECHK(getfield, symbol, args[3]);
JL_TYPECHK(getfield, bool, args[4]);
order = jl_get_atomic_order_checked((jl_sym_t*)args[3], 1, 0);
JL_TYPECHK(getfield, symbol, args[2]);
JL_TYPECHK(getfield, bool, args[3]);
order = jl_get_atomic_order_checked((jl_sym_t*)args[2], 1, 0);
}
else if (nargs == 3) {
if (!jl_is_bool(args[2])) {
Expand Down
8 changes: 8 additions & 0 deletions src/debuginfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1077,6 +1077,14 @@ bool jl_dylib_DI_for_fptr(size_t pointer, object::SectionRef *Section, int64_t *
struct link_map *extra_info;
dladdr_success = dladdr1((void*)pointer, &dlinfo, (void**)&extra_info, RTLD_DL_LINKMAP) != 0;
#else
#ifdef _OS_DARWIN_
// On macOS 12, dladdr(-1, …) succeeds and returns the main executable image,
// despite there never actually being an image there. This is not what we want,
// as we use -1 as a known-invalid value e.g. in the test suite.
if (pointer == ~(size_t)0) {
return false;
}
#endif
dladdr_success = dladdr((void*)pointer, &dlinfo) != 0;
#endif
if (!dladdr_success || !dlinfo.dli_fname)
Expand Down
3 changes: 2 additions & 1 deletion src/llvm-final-gc-lowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -218,10 +218,11 @@ bool FinalLowerGC::doInitialization(Module &M) {

bool FinalLowerGC::doFinalization(Module &M)
{
GlobalValue *functionList[] = {queueRootFunc, poolAllocFunc, bigAllocFunc};
queueRootFunc = poolAllocFunc = bigAllocFunc = nullptr;
auto used = M.getGlobalVariable("llvm.compiler.used");
if (!used)
return false;
GlobalValue *functionList[] = {queueRootFunc, poolAllocFunc, bigAllocFunc};
SmallPtrSet<Constant*, 16> InitAsSet(
functionList,
functionList + sizeof(functionList) / sizeof(void*));
Expand Down
37 changes: 29 additions & 8 deletions src/llvm-late-gc-lowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1129,12 +1129,14 @@ static bool isConstGV(GlobalVariable *gv)
return gv->isConstant() || gv->getMetadata("julia.constgv");
}

static bool isLoadFromConstGV(LoadInst *LI, bool &task_local);
static bool isLoadFromConstGV(Value *v, bool &task_local)
typedef llvm::SmallPtrSet<PHINode*, 1> PhiSet;

static bool isLoadFromConstGV(LoadInst *LI, bool &task_local, PhiSet *seen = nullptr);
static bool isLoadFromConstGV(Value *v, bool &task_local, PhiSet *seen = nullptr)
{
v = v->stripInBoundsOffsets();
if (auto LI = dyn_cast<LoadInst>(v))
return isLoadFromConstGV(LI, task_local);
return isLoadFromConstGV(LI, task_local, seen);
if (auto gv = dyn_cast<GlobalVariable>(v))
return isConstGV(gv);
// null pointer
Expand All @@ -1145,12 +1147,19 @@ static bool isLoadFromConstGV(Value *v, bool &task_local)
return (CE->getOpcode() == Instruction::IntToPtr &&
isa<ConstantData>(CE->getOperand(0)));
if (auto SL = dyn_cast<SelectInst>(v))
return (isLoadFromConstGV(SL->getTrueValue(), task_local) &&
isLoadFromConstGV(SL->getFalseValue(), task_local));
return (isLoadFromConstGV(SL->getTrueValue(), task_local, seen) &&
isLoadFromConstGV(SL->getFalseValue(), task_local, seen));
if (auto Phi = dyn_cast<PHINode>(v)) {
PhiSet ThisSet(&Phi, &Phi);
if (!seen)
seen = &ThisSet;
else if (seen->count(Phi))
return true;
else
seen->insert(Phi);
auto n = Phi->getNumIncomingValues();
for (unsigned i = 0; i < n; ++i) {
if (!isLoadFromConstGV(Phi->getIncomingValue(i), task_local)) {
if (!isLoadFromConstGV(Phi->getIncomingValue(i), task_local, seen)) {
return false;
}
}
Expand Down Expand Up @@ -1182,7 +1191,7 @@ static bool isLoadFromConstGV(Value *v, bool &task_local)
//
// The white list implemented here and above in `isLoadFromConstGV(Value*)` should
// cover all the cases we and LLVM generates.
static bool isLoadFromConstGV(LoadInst *LI, bool &task_local)
static bool isLoadFromConstGV(LoadInst *LI, bool &task_local, PhiSet *seen)
{
// We only emit single slot GV in codegen
// but LLVM global merging can change the pointer operands to GEPs/bitcasts
Expand All @@ -1192,7 +1201,7 @@ static bool isLoadFromConstGV(LoadInst *LI, bool &task_local)
{"jtbaa_immut", "jtbaa_const", "jtbaa_datatype"})) {
if (gv)
return true;
return isLoadFromConstGV(load_base, task_local);
return isLoadFromConstGV(load_base, task_local, seen);
}
if (gv)
return isConstGV(gv);
Expand Down Expand Up @@ -2237,6 +2246,18 @@ bool LateLowerGCFrame::CleanupIR(Function &F, State *S) {
I->setMetadata(LLVMContext::MD_tbaa, MutableTBAA);
}
}
// FCA chains created by SROA start with an undef value
// if the type contains an tracked pointer that can lead to a partial
// initialisation and LateLower might have inserted an extractvalue
// of an undef field. Fix this by changing it to start with an zero-init
if (auto *IV = dyn_cast<InsertValueInst>(*&it)) {
Value *SourceAggregate = IV->getAggregateOperand();
if (isa<UndefValue>(SourceAggregate)) {
IV->setOperand(IV->getAggregateOperandIndex(), ConstantAggregateZero::get(IV->getType()));
ChangesMade = true;
}
}

auto *CI = dyn_cast<CallInst>(&*it);
if (!CI) {
++it;
Expand Down
25 changes: 25 additions & 0 deletions src/mach_dyld_atfork.tbd
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
--- !tapi-tbd
# copied from XCode's libSystem.tbd (current-version: 1311)
# to provide weak-linkage info for new symbols on old systems
tbd-version: 4
targets: [ x86_64-macos, x86_64-maccatalyst, arm64-macos, arm64-maccatalyst,
arm64e-macos, arm64e-maccatalyst ]
uuids:
- target: x86_64-macos
value: AFE6C76A-B47A-35F5-91D0-4E9FC439E90D
- target: x86_64-maccatalyst
value: AFE6C76A-B47A-35F5-91D0-4E9FC439E90D
- target: arm64-macos
value: 2EA09BDB-811B-33AA-BB58-4B53AA2DB522
- target: arm64-maccatalyst
value: 2EA09BDB-811B-33AA-BB58-4B53AA2DB522
- target: arm64e-macos
value: 09AB3723-C26D-3762-93BA-98E9C38B89C1
- target: arm64e-maccatalyst
value: 09AB3723-C26D-3762-93BA-98E9C38B89C1
install-name: '/usr/lib/libSystem.B.dylib'
exports:
- targets: [ arm64-macos, arm64e-macos, x86_64-macos, x86_64-maccatalyst,
arm64-maccatalyst, arm64e-maccatalyst ]
symbols: [ __dyld_atfork_parent, __dyld_atfork_prepare ]
...
42 changes: 36 additions & 6 deletions src/signals-mach.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ extern void *_keymgr_get_and_lock_processwide_ptr(unsigned int key);
extern int _keymgr_get_and_lock_processwide_ptr_2(unsigned int key, void **result);
extern int _keymgr_set_lockmode_processwide_ptr(unsigned int key, unsigned int mode);

// private dyld3/dyld4 stuff
extern void _dyld_atfork_prepare(void) __attribute__((weak_import));
extern void _dyld_atfork_parent(void) __attribute__((weak_import));
//extern void _dyld_fork_child(void) __attribute__((weak_import));

static void attach_exception_port(thread_port_t thread, int segv_only);

// low 16 bits are the thread id, the next 8 bits are the original gc_state
Expand Down Expand Up @@ -521,6 +526,31 @@ static kern_return_t profiler_segv_handler
}
#endif

// WARNING: we are unable to handle sigsegv while the dlsymlock is held
static int jl_lock_profile_mach(int dlsymlock)
{
jl_lock_profile();
// workaround for old keymgr bugs
void *unused = NULL;
int keymgr_locked = _keymgr_get_and_lock_processwide_ptr_2(KEYMGR_GCC3_DW2_OBJ_LIST, &unused) == 0;
// workaround for new dlsym4 bugs (API and bugs introduced in macOS 12.1)
if (dlsymlock && _dyld_atfork_prepare != NULL && _dyld_atfork_parent != NULL)
_dyld_atfork_prepare();
return keymgr_locked;
}

static void jl_unlock_profile_mach(int dlsymlock, int keymgr_locked)
{
if (dlsymlock && _dyld_atfork_prepare != NULL && _dyld_atfork_parent != NULL) \
_dyld_atfork_parent(); \
if (keymgr_locked)
_keymgr_unlock_processwide_ptr(KEYMGR_GCC3_DW2_OBJ_LIST);
jl_unlock_profile();
}

#define jl_lock_profile() int keymgr_locked = jl_lock_profile_mach(1)
#define jl_unlock_profile() jl_unlock_profile_mach(1, keymgr_locked)

void *mach_profile_listener(void *arg)
{
(void)arg;
Expand All @@ -538,19 +568,21 @@ void *mach_profile_listener(void *arg)
HANDLE_MACH_ERROR("mach_msg", ret);
// sample each thread, round-robin style in reverse order
// (so that thread zero gets notified last)
jl_lock_profile();
void *unused = NULL;
int keymgr_locked = _keymgr_get_and_lock_processwide_ptr_2(KEYMGR_GCC3_DW2_OBJ_LIST, &unused) == 0;
int keymgr_locked = jl_lock_profile_mach(0);
for (i = jl_n_threads; i-- > 0; ) {
// if there is no space left, break early
if (jl_profile_is_buffer_full()) {
jl_profile_stop_timer();
break;
}

if (_dyld_atfork_prepare != NULL && _dyld_atfork_parent != NULL)
_dyld_atfork_prepare(); // briefly acquire the dlsym lock
host_thread_state_t state;
jl_thread_suspend_and_get_state2(i, &state);
unw_context_t *uc = (unw_context_t*)&state;
if (_dyld_atfork_prepare != NULL && _dyld_atfork_parent != NULL)
_dyld_atfork_parent(); // quickly release the dlsym lock

if (running) {
#ifdef LLVMLIBUNWIND
Expand Down Expand Up @@ -593,9 +625,7 @@ void *mach_profile_listener(void *arg)
// We're done! Resume the thread.
jl_thread_resume(i, 0);
}
if (keymgr_locked)
_keymgr_unlock_processwide_ptr(KEYMGR_GCC3_DW2_OBJ_LIST);
jl_unlock_profile();
jl_unlock_profile_mach(0, keymgr_locked);
if (running) {
// Reset the alarm
kern_return_t ret = clock_alarm(clk, TIME_RELATIVE, timerprof, profile_port);
Expand Down
Loading