mirror of
https://github.com/Noratrieb/libuwuc.git
synced 2026-01-14 19:55:07 +01:00
make errno a static instead of TLS
This commit is contained in:
parent
00f78e9749
commit
7a16d84b25
15 changed files with 57 additions and 55 deletions
|
|
@ -1,18 +1,20 @@
|
||||||
use core::{cell::UnsafeCell, ptr::addr_of};
|
use core::{cell::UnsafeCell, ptr::addr_of};
|
||||||
|
|
||||||
#[thread_local]
|
use crate::utils::SyncUnsafeCell;
|
||||||
static ERRNO: UnsafeCell<i32> = UnsafeCell::new(0);
|
|
||||||
|
// Todo: This should be a thread local once we have threads.
|
||||||
|
static ERRNO: SyncUnsafeCell<i32> = SyncUnsafeCell(UnsafeCell::new(0));
|
||||||
|
|
||||||
pub fn errno_location() -> *const i32 {
|
pub fn errno_location() -> *const i32 {
|
||||||
addr_of!(ERRNO).cast()
|
addr_of!(ERRNO).cast()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn errno() -> i32 {
|
pub fn errno() -> i32 {
|
||||||
unsafe { *ERRNO.get() }
|
unsafe { *ERRNO.0.get() }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_errno(errno: i32) {
|
pub fn set_errno(errno: i32) {
|
||||||
unsafe { ERRNO.get().write(errno) }
|
unsafe { ERRNO.0.get().write(errno) }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const EPERM: i32 = 1; /* Operation not permitted */
|
pub const EPERM: i32 = 1; /* Operation not permitted */
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,7 @@ mod tests {
|
||||||
fn memcmp_eq_one() {
|
fn memcmp_eq_one() {
|
||||||
let a = [1];
|
let a = [1];
|
||||||
let b = [1];
|
let b = [1];
|
||||||
let result = unsafe { super::memcmp(a.as_ptr(), b.as_ptr(), 1)};
|
let result = unsafe { super::memcmp(a.as_ptr(), b.as_ptr(), 1) };
|
||||||
assert_eq!(result, 0);
|
assert_eq!(result, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -103,7 +103,7 @@ mod tests {
|
||||||
fn memcmp_lt_one() {
|
fn memcmp_lt_one() {
|
||||||
let a = [0];
|
let a = [0];
|
||||||
let b = [1];
|
let b = [1];
|
||||||
let result = unsafe { super::memcmp(a.as_ptr(), b.as_ptr(), 1)};
|
let result = unsafe { super::memcmp(a.as_ptr(), b.as_ptr(), 1) };
|
||||||
assert_eq!(result, -1);
|
assert_eq!(result, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -127,7 +127,7 @@ mod tests {
|
||||||
fn memcmp_gt_one() {
|
fn memcmp_gt_one() {
|
||||||
let a = [255];
|
let a = [255];
|
||||||
let b = [1];
|
let b = [1];
|
||||||
let result = unsafe { super::memcmp(a.as_ptr(), b.as_ptr(), 1)};
|
let result = unsafe { super::memcmp(a.as_ptr(), b.as_ptr(), 1) };
|
||||||
assert_eq!(result, 1);
|
assert_eq!(result, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
|
||||||
|
|
@ -5,4 +5,4 @@ cfg_if::cfg_if! {
|
||||||
} else {
|
} else {
|
||||||
compile_error!("uwuc does not support this target yet!");
|
compile_error!("uwuc does not support this target yet!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,4 +4,4 @@ macro_rules! trap {
|
||||||
::core::arch::asm!("ud2");
|
::core::arch::asm!("ud2");
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
pub(crate) use trap;
|
pub(crate) use trap;
|
||||||
|
|
|
||||||
|
|
@ -113,4 +113,4 @@ macro_rules! syscall {
|
||||||
}};
|
}};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub use syscall;
|
pub use syscall;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("cargo:rustc-link-arg=-nostartfiles");
|
println!("cargo:rustc-link-arg=-nostartfiles");
|
||||||
println!("cargo:rustc-link-arg=-nostdlib");
|
println!("cargo:rustc-link-arg=-nostdlib");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,6 @@ pub unsafe extern "C" fn memcmp(s1: *const u8, s2: *const u8, size: usize) -> i3
|
||||||
libuwuc::mem::memcmp(s1, s2, size)
|
libuwuc::mem::memcmp(s1, s2, size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn bcmp(s1: *const u8, s2: *const u8, size: usize) -> i32 {
|
pub unsafe extern "C" fn bcmp(s1: *const u8, s2: *const u8, size: usize) -> i32 {
|
||||||
libuwuc::mem::memcmp(s1, s2, size)
|
libuwuc::mem::memcmp(s1, s2, size)
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
#include<stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
char *self = argv[0];
|
char *self = argv[0];
|
||||||
char first = self[0];
|
char first = self[0];
|
||||||
if (first != '/') {
|
if (first != '/') {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
//@ignore doens't initialize fs yet
|
#include <errno.h>
|
||||||
#include<errno.h>
|
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
int err = errno;
|
int err = errno;
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,14 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
char *env = getenv("PATH");
|
char *env = getenv("PATH");
|
||||||
if (!env) {
|
if (!env) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *env2 = getenv("__some absolutely NONSENSE that no one would ever define please..");
|
char *env2 = getenv(
|
||||||
if (env2) {
|
"__some absolutely NONSENSE that no one would ever define please..");
|
||||||
return 1;
|
if (env2) {
|
||||||
}
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
#include<stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
char *alloc = (char*) malloc(10);
|
char *alloc = (char *)malloc(10);
|
||||||
*alloc = 1;
|
*alloc = 1;
|
||||||
*(alloc + 9) = 2;
|
*(alloc + 9) = 2;
|
||||||
free(alloc);
|
free(alloc);
|
||||||
}
|
}
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
#include<string.h>
|
#include <string.h>
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
char buf[10];
|
char buf[10];
|
||||||
|
|
||||||
memset(buf, 34, sizeof(buf));
|
memset(buf, 34, sizeof(buf));
|
||||||
|
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
if (buf[i] != 34) {
|
if (buf[i] != 34) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
#include<stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
int result = printf("Hello, world!\n");
|
int result = printf("Hello, world!\n");
|
||||||
if (result != 14) {
|
if (result != 14) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
#include<stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
char *str = "12";
|
char *str = "12";
|
||||||
long value = strtol(str, NULL, 10);
|
long value = strtol(str, NULL, 10);
|
||||||
if (value != 12) {
|
if (value != 12) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue