blob: 2347c17797f45b2138bf7e166474ffd2486eda7a [file]
// Copyright 2016 The Fuchsia Authors
// Copyright (c) 2016 Travis Geiselbrecht
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include <arch/x86/mp.h>
#ifndef ZIRCON_KERNEL_ARCH_X86_INCLUDE_ARCH_CURRENT_THREAD_H_
#define ZIRCON_KERNEL_ARCH_X86_INCLUDE_ARCH_CURRENT_THREAD_H_
static inline thread_t* get_current_thread(void) {
/* Read directly from gs, rather than via x86_get_percpu()->current_thread,
* so that this is atomic. Otherwise, we could context switch between the
* read of percpu from gs and the read of the current_thread pointer, and
* discover the current thread on a different CPU */
return (thread_t*)x86_read_gs_offset64(PERCPU_CURRENT_THREAD_OFFSET);
}
static inline void set_current_thread(thread_t* t) {
/* See above for why this is a direct gs write */
x86_write_gs_offset64(PERCPU_CURRENT_THREAD_OFFSET, (uint64_t)t);
}
#endif // ZIRCON_KERNEL_ARCH_X86_INCLUDE_ARCH_CURRENT_THREAD_H_