kernel: Rename set/clear_ac to arch_cpu_enable/disable_user_access.

These are architecture-specific routines, so they deserve proper
architecture-specific naming. The user memory access routines are
already under arch_cpu (arch_cpu_user_memcpy, etc.), and the methods
usually change a CPU flag, so it makes sense to put these there too.

RISC-V had get_ac but nothing else defined or used it, so it's removed.

No functional change intended.

Change-Id: Id4715214e32f73d4a93bc7ba8249411a0878d174
Reviewed-on: https://review.haiku-os.org/c/haiku/+/8106
Reviewed-by: waddlesplash <[email protected]>
Reviewed-by: X512 X512 <[email protected]>
Reviewed-by: Jérôme Duval <[email protected]>
Tested-by: Commit checker robot <[email protected]>
This commit is contained in:
Augustin Cavalier
2024-08-26 19:39:28 +00:00
committed by waddlesplash
parent dadc497fbc
commit 6f88de113d
15 changed files with 57 additions and 65 deletions
+2 -2
View File
@@ -16,8 +16,8 @@
#define dmb() __asm__ __volatile__("dmb" : : : "memory") #define dmb() __asm__ __volatile__("dmb" : : : "memory")
#define wfi() __asm__ __volatile__("wfi" : : : "memory") #define wfi() __asm__ __volatile__("wfi" : : : "memory")
#define set_ac() #define arch_cpu_enable_user_access()
#define clear_ac() #define arch_cpu_disable_user_access()
#ifndef _ASSEMBLER #ifndef _ASSEMBLER
+2 -2
View File
@@ -10,8 +10,8 @@
#define CACHE_LINE_SIZE 64 #define CACHE_LINE_SIZE 64
// TODO: These will require a real implementation when PAN is enabled // TODO: These will require a real implementation when PAN is enabled
#define set_ac() #define arch_cpu_enable_user_access()
#define clear_ac() #define arch_cpu_disable_user_access()
#include <kernel/arch/arm64/arm_registers.h> #include <kernel/arch/arm64/arm_registers.h>
@@ -65,12 +65,12 @@ bool user_access(Function function)
// destructor. // destructor.
auto fail = setjmp(thread_get_current_thread()->fault_handler_state); auto fail = setjmp(thread_get_current_thread()->fault_handler_state);
if (fail == 0) { if (fail == 0) {
set_ac(); arch_cpu_enable_user_access();
function(); function();
clear_ac(); arch_cpu_disable_user_access();
return true; return true;
} }
clear_ac(); arch_cpu_disable_user_access();
return false; return false;
} }
+2 -2
View File
@@ -18,8 +18,8 @@
#define CACHE_LINE_SIZE 16 #define CACHE_LINE_SIZE 16
#define set_ac() #define arch_cpu_enable_user_access()
#define clear_ac() #define arch_cpu_disable_user_access()
#define SR_IP_MASK 0x0700 #define SR_IP_MASK 0x0700
+2 -2
View File
@@ -15,8 +15,8 @@
// 128 Byte lines on PPC970 // 128 Byte lines on PPC970
#define set_ac() #define arch_cpu_enable_user_access()
#define clear_ac() #define arch_cpu_disable_user_access()
struct iframe { struct iframe {
@@ -16,22 +16,15 @@
#define CACHE_LINE_SIZE 64 #define CACHE_LINE_SIZE 64
static inline bool
get_ac()
{
return SstatusReg{.val = Sstatus()}.sum;
}
static inline void static inline void
set_ac() arch_cpu_enable_user_access()
{ {
SetBitsSstatus(SstatusReg{.sum = 1}.val); SetBitsSstatus(SstatusReg{.sum = 1}.val);
} }
static inline void static inline void
clear_ac() arch_cpu_disable_user_access()
{ {
ClearBitsSstatus(SstatusReg{.sum = 1}.val); ClearBitsSstatus(SstatusReg{.sum = 1}.val);
} }
+2 -2
View File
@@ -16,8 +16,8 @@
// 128 Byte lines on PPC970 // 128 Byte lines on PPC970
#define set_ac() #define arch_cpu_enable_user_access()
#define clear_ac() #define arch_cpu_disable_user_access()
typedef struct arch_cpu_info { typedef struct arch_cpu_info {
@@ -64,10 +64,10 @@ x86_write_cr3(size_t value)
#define wbinvd() \ #define wbinvd() \
__asm__ volatile ("wbinvd" : : : "memory") __asm__ volatile ("wbinvd" : : : "memory")
#define set_ac() \ #define arch_cpu_enable_user_access() \
__asm__ volatile (ASM_STAC : : : "memory") __asm__ volatile (ASM_STAC : : : "memory")
#define clear_ac() \ #define arch_cpu_disable_user_access() \
__asm__ volatile (ASM_CLAC : : : "memory") __asm__ volatile (ASM_CLAC : : : "memory")
#define xgetbv(reg) ({ \ #define xgetbv(reg) ({ \
@@ -136,7 +136,7 @@ arch_vm_translation_map_init(kernel_args *args,
dprintf("physMemBase: %#" B_PRIxADDR "\n", args->physical_memory_range[0].start); dprintf("physMemBase: %#" B_PRIxADDR "\n", args->physical_memory_range[0].start);
gVirtFromPhysOffset = args->arch_args.physMap.start - args->physical_memory_range[0].start; gVirtFromPhysOffset = args->arch_args.physMap.start - args->physical_memory_range[0].start;
clear_ac(); arch_cpu_disable_user_access();
*_physicalPageMapper = new(&sPhysicalPageMapperData) *_physicalPageMapper = new(&sPhysicalPageMapperData)
RISCV64VMPhysicalPageMapper(); RISCV64VMPhysicalPageMapper();
+4 -4
View File
@@ -286,10 +286,10 @@ arch_thread_enter_userspace(Thread* thread, addr_t entry, void* args1,
// entry function returns to the top of the stack to act as the return // entry function returns to the top of the stack to act as the return
// address. The stub is inside commpage. // address. The stub is inside commpage.
addr_t commPageAddress = (addr_t)thread->team->commpage_address; addr_t commPageAddress = (addr_t)thread->team->commpage_address;
set_ac(); arch_cpu_enable_user_access();
codeAddr = ((addr_t*)commPageAddress)[COMMPAGE_ENTRY_X86_THREAD_EXIT] codeAddr = ((addr_t*)commPageAddress)[COMMPAGE_ENTRY_X86_THREAD_EXIT]
+ commPageAddress; + commPageAddress;
clear_ac(); arch_cpu_disable_user_access();
if (user_memcpy((void*)stackTop, (const void*)&codeAddr, sizeof(codeAddr)) if (user_memcpy((void*)stackTop, (const void*)&codeAddr, sizeof(codeAddr))
!= B_OK) != B_OK)
return B_BAD_ADDRESS; return B_BAD_ADDRESS;
@@ -406,10 +406,10 @@ arch_setup_signal_frame(Thread* thread, struct sigaction* action,
// stack. First argument points to the frame data. // stack. First argument points to the frame data.
addr_t* commPageAddress = (addr_t*)thread->team->commpage_address; addr_t* commPageAddress = (addr_t*)thread->team->commpage_address;
frame->user_sp = (addr_t)userStack; frame->user_sp = (addr_t)userStack;
set_ac(); arch_cpu_enable_user_access();
frame->ip = commPageAddress[COMMPAGE_ENTRY_X86_SIGNAL_HANDLER] frame->ip = commPageAddress[COMMPAGE_ENTRY_X86_SIGNAL_HANDLER]
+ (addr_t)commPageAddress; + (addr_t)commPageAddress;
clear_ac(); arch_cpu_disable_user_access();
frame->di = (addr_t)userSignalFrameData; frame->di = (addr_t)userSignalFrameData;
frame->flags &= ~(uint64)(X86_EFLAGS_TRAP | X86_EFLAGS_DIRECTION); frame->flags &= ~(uint64)(X86_EFLAGS_TRAP | X86_EFLAGS_DIRECTION);
@@ -27,10 +27,10 @@
#else #else
#define mutex_lock(...) #define mutex_lock(...)
#define mutex_unlock(...) #define mutex_unlock(...)
#undef set_ac #undef arch_cpu_enable_user_access
#undef clear_ac #undef arch_cpu_disable_user_access
#define set_ac() #define arch_cpu_enable_user_access()
#define clear_ac() #define arch_cpu_disable_user_access()
#endif #endif
#include "font.h" #include "font.h"
@@ -153,7 +153,7 @@ render_glyph(int32 column, int32 row, uint8 glyph, uint8 attr)
uint8* color = get_palette_entry(foreground_color(attr)); uint8* color = get_palette_entry(foreground_color(attr));
uint8* backgroundColor = get_palette_entry(background_color(attr)); uint8* backgroundColor = get_palette_entry(background_color(attr));
set_ac(); arch_cpu_enable_user_access();
for (int y = 0; y < sConsole.font->glyphHeight; y++) { for (int y = 0; y < sConsole.font->glyphHeight; y++) {
uint16_t bits = get_font_data(glyph, y); uint16_t bits = get_font_data(glyph, y);
for (int x = 0; x < sConsole.font->glyphWidth; x++) { for (int x = 0; x < sConsole.font->glyphWidth; x++) {
@@ -170,8 +170,7 @@ render_glyph(int32 column, int32 row, uint8 glyph, uint8 attr)
base += sConsole.bytes_per_row; base += sConsole.bytes_per_row;
} }
clear_ac(); arch_cpu_disable_user_access();
} else { } else {
// VGA mode will be treated as monochrome // VGA mode will be treated as monochrome
// (ie. only the first plane will be used) // (ie. only the first plane will be used)
@@ -181,7 +180,7 @@ render_glyph(int32 column, int32 row, uint8 glyph, uint8 attr)
+ column * sConsole.font->glyphWidth / 8); + column * sConsole.font->glyphWidth / 8);
uint8 baseOffset = (column * sConsole.font->glyphWidth) & 0x7; uint8 baseOffset = (column * sConsole.font->glyphWidth) & 0x7;
set_ac(); arch_cpu_enable_user_access();
for (int y = 0; y < sConsole.font->glyphHeight; y++) { for (int y = 0; y < sConsole.font->glyphHeight; y++) {
uint16_t bits = get_font_data(glyph, y); uint16_t bits = get_font_data(glyph, y);
uint8 offset = baseOffset; uint8 offset = baseOffset;
@@ -204,7 +203,7 @@ render_glyph(int32 column, int32 row, uint8 glyph, uint8 attr)
base += sConsole.bytes_per_row; base += sConsole.bytes_per_row;
} }
clear_ac(); arch_cpu_disable_user_access();
} }
} }
@@ -226,14 +225,14 @@ draw_cursor(int32 x, int32 y)
endY /= 8; endY /= 8;
} }
set_ac(); arch_cpu_enable_user_access();
for (; y < endY; y++) { for (; y < endY; y++) {
for (int32 x2 = x; x2 < endX; x2++) for (int32 x2 = x; x2 < endX; x2++)
base[x2] = ~base[x2]; base[x2] = ~base[x2];
base += sConsole.bytes_per_row; base += sConsole.bytes_per_row;
} }
clear_ac(); arch_cpu_disable_user_access();
} }
@@ -318,14 +317,14 @@ console_blit(int32 srcx, int32 srcy, int32 width, int32 height, int32 destx,
destx = destx * sConsole.font->glyphWidth / 8; destx = destx * sConsole.font->glyphWidth / 8;
} }
set_ac(); arch_cpu_enable_user_access();
for (int32 y = 0; y < height; y++) { for (int32 y = 0; y < height; y++) {
memmove((void*)(sConsole.frame_buffer + (desty + y) memmove((void*)(sConsole.frame_buffer + (desty + y)
* sConsole.bytes_per_row + destx), * sConsole.bytes_per_row + destx),
(void*)(sConsole.frame_buffer + (srcy + y) * sConsole.bytes_per_row (void*)(sConsole.frame_buffer + (srcy + y) * sConsole.bytes_per_row
+ srcx), width); + srcx), width);
} }
clear_ac(); arch_cpu_disable_user_access();
} }
@@ -335,7 +334,7 @@ console_clear(uint8 attr)
if (!frame_buffer_console_available()) if (!frame_buffer_console_available())
return; return;
set_ac(); arch_cpu_enable_user_access();
switch (sConsole.bytes_per_pixel) { switch (sConsole.bytes_per_pixel) {
case 1: case 1:
if (sConsole.depth >= 8) { if (sConsole.depth >= 8) {
@@ -364,8 +363,8 @@ console_clear(uint8 attr)
break; break;
} }
} }
arch_cpu_disable_user_access();
clear_ac();
sConsole.cursor_x = -1; sConsole.cursor_x = -1;
sConsole.cursor_y = -1; sConsole.cursor_y = -1;
} }
+6 -6
View File
@@ -1988,9 +1988,9 @@ elf_load_user_image(const char *path, Team *team, uint32 flags, addr_t *entry)
size_t amount = fileUpperBound size_t amount = fileUpperBound
- (programHeaders[i].p_vaddr % B_PAGE_SIZE) - (programHeaders[i].p_vaddr % B_PAGE_SIZE)
- (programHeaders[i].p_filesz); - (programHeaders[i].p_filesz);
set_ac(); arch_cpu_enable_user_access();
memset((void *)start, 0, amount); memset((void *)start, 0, amount);
clear_ac(); arch_cpu_disable_user_access();
// Check if we need extra storage for the bss - we have to do this if // Check if we need extra storage for the bss - we have to do this if
// the above region doesn't already comprise the memory size, too. // the above region doesn't already comprise the memory size, too.
@@ -2050,20 +2050,20 @@ elf_load_user_image(const char *path, Team *team, uint32 flags, addr_t *entry)
// modify the dynamic ptr by the delta of the regions // modify the dynamic ptr by the delta of the regions
image->dynamic_section += image->text_region.delta; image->dynamic_section += image->text_region.delta;
set_ac(); arch_cpu_enable_user_access();
status = elf_parse_dynamic_section(image); status = elf_parse_dynamic_section(image);
if (status != B_OK) { if (status != B_OK) {
clear_ac(); arch_cpu_disable_user_access();
return status; return status;
} }
status = elf_relocate(image, image); status = elf_relocate(image, image);
if (status != B_OK) { if (status != B_OK) {
clear_ac(); arch_cpu_disable_user_access();
return status; return status;
} }
clear_ac(); arch_cpu_disable_user_access();
// set correct area protection // set correct area protection
for (int i = 0; i < elfHeader.e_phnum; i++) { for (int i = 0; i < elfHeader.e_phnum; i++) {
+8 -8
View File
@@ -83,9 +83,9 @@ user_atomic_or(int32* value, int32 orValue, bool isWired)
{ {
int32 result; int32 result;
if (isWired) { if (isWired) {
set_ac(); arch_cpu_enable_user_access();
result = atomic_or(value, orValue); result = atomic_or(value, orValue);
clear_ac(); arch_cpu_disable_user_access();
return result; return result;
} }
@@ -100,9 +100,9 @@ user_atomic_and(int32* value, int32 andValue, bool isWired)
{ {
int32 result; int32 result;
if (isWired) { if (isWired) {
set_ac(); arch_cpu_enable_user_access();
result = atomic_and(value, andValue); result = atomic_and(value, andValue);
clear_ac(); arch_cpu_disable_user_access();
return result; return result;
} }
@@ -117,9 +117,9 @@ user_atomic_get(int32* value, bool isWired)
{ {
int32 result; int32 result;
if (isWired) { if (isWired) {
set_ac(); arch_cpu_enable_user_access();
result = atomic_get(value); result = atomic_get(value);
clear_ac(); arch_cpu_disable_user_access();
return result; return result;
} }
@@ -135,9 +135,9 @@ user_atomic_test_and_set(int32* value, int32 newValue, int32 testAgainst,
{ {
int32 result; int32 result;
if (isWired) { if (isWired) {
set_ac(); arch_cpu_enable_user_access();
result = atomic_test_and_set(value, newValue, testAgainst); result = atomic_test_and_set(value, newValue, testAgainst);
clear_ac(); arch_cpu_disable_user_access();
return result; return result;
} }
+3 -3
View File
@@ -942,17 +942,17 @@ handle_signals(Thread* thread)
sigset_t nonBlockedMask = ~thread->sig_block_mask; sigset_t nonBlockedMask = ~thread->sig_block_mask;
sigset_t signalMask = thread->AllPendingSignals() & nonBlockedMask; sigset_t signalMask = thread->AllPendingSignals() & nonBlockedMask;
set_ac(); arch_cpu_enable_user_access();
if (thread->user_thread->defer_signals > 0 if (thread->user_thread->defer_signals > 0
&& (signalMask & NON_DEFERRABLE_SIGNALS) == 0 && (signalMask & NON_DEFERRABLE_SIGNALS) == 0
&& thread->sigsuspend_original_unblocked_mask == 0) { && thread->sigsuspend_original_unblocked_mask == 0) {
thread->user_thread->pending_signals = signalMask; thread->user_thread->pending_signals = signalMask;
clear_ac(); arch_cpu_disable_user_access();
return; return;
} }
thread->user_thread->pending_signals = 0; thread->user_thread->pending_signals = 0;
clear_ac(); arch_cpu_disable_user_access();
// determine syscall restart behavior // determine syscall restart behavior
uint32 restartFlags = atomic_and(&thread->flags, uint32 restartFlags = atomic_and(&thread->flags,
+4 -4
View File
@@ -651,14 +651,14 @@ enter_userspace(Thread* thread, UserThreadEntryArguments* args)
// init the thread's user_thread // init the thread's user_thread
user_thread* userThread = thread->user_thread; user_thread* userThread = thread->user_thread;
set_ac(); arch_cpu_enable_user_access();
userThread->pthread = args->pthread; userThread->pthread = args->pthread;
userThread->flags = 0; userThread->flags = 0;
userThread->wait_status = B_OK; userThread->wait_status = B_OK;
userThread->defer_signals userThread->defer_signals
= (args->flags & THREAD_CREATION_FLAG_DEFER_SIGNALS) != 0 ? 1 : 0; = (args->flags & THREAD_CREATION_FLAG_DEFER_SIGNALS) != 0 ? 1 : 0;
userThread->pending_signals = 0; userThread->pending_signals = 0;
clear_ac(); arch_cpu_disable_user_access();
// initialize default TLS fields // initialize default TLS fields
addr_t tls[TLS_FIRST_FREE_SLOT]; addr_t tls[TLS_FIRST_FREE_SLOT];
@@ -674,12 +674,12 @@ enter_userspace(Thread* thread, UserThreadEntryArguments* args)
// This is a fork()ed thread. // This is a fork()ed thread.
// Update select TLS values, do not clear the whole array. // Update select TLS values, do not clear the whole array.
set_ac(); arch_cpu_enable_user_access();
addr_t* userTls = (addr_t*)thread->user_local_storage; addr_t* userTls = (addr_t*)thread->user_local_storage;
ASSERT(userTls[TLS_BASE_ADDRESS_SLOT] == thread->user_local_storage); ASSERT(userTls[TLS_BASE_ADDRESS_SLOT] == thread->user_local_storage);
userTls[TLS_THREAD_ID_SLOT] = tls[TLS_THREAD_ID_SLOT]; userTls[TLS_THREAD_ID_SLOT] = tls[TLS_THREAD_ID_SLOT];
userTls[TLS_USER_THREAD_SLOT] = tls[TLS_USER_THREAD_SLOT]; userTls[TLS_USER_THREAD_SLOT] = tls[TLS_USER_THREAD_SLOT];
clear_ac(); arch_cpu_disable_user_access();
// Copy the fork args onto the stack and free them. // Copy the fork args onto the stack and free them.
arch_fork_arg archArgs = *args->forkArgs; arch_fork_arg archArgs = *args->forkArgs;