From 76faf0581d852c4284f6d30e85b5defcdcd425c5 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Sat, 18 Oct 2025 10:01:57 +0200 Subject: [PATCH] ulib setjmp() and longjmp() --- ulib/Makefile | 1 + ulib/jump/jump.S | 33 +++++++++++++++++++++++++++++++++ ulib/jump/jump.h | 23 +++++++++++++++++++++++ ulib/setjmp.h | 6 ++++++ 4 files changed, 63 insertions(+) create mode 100644 ulib/jump/jump.S create mode 100644 ulib/jump/jump.h create mode 100644 ulib/setjmp.h diff --git a/ulib/Makefile b/ulib/Makefile index 9ca243b..53cd1dc 100644 --- a/ulib/Makefile +++ b/ulib/Makefile @@ -17,6 +17,7 @@ SRCFILES := $(call GRABSRC, \ umalloc \ fs \ time \ + jump \ ) CFLAGS += -isystem $(ROOT)/share -isystem $(ROOT)/ulib -isystem $(ROOT)/std/include \ diff --git a/ulib/jump/jump.S b/ulib/jump/jump.S new file mode 100644 index 0000000..9d2411d --- /dev/null +++ b/ulib/jump/jump.S @@ -0,0 +1,33 @@ +// https://patchwork.ozlabs.org/project/uboot/patch/c315e41d155612260223ef75afa06bd728a3e705.1529433258.git.ivan.gorinov@intel.com/ + +.global setjmp +setjmp: + pop %rcx + movq %rcx, (%rdi) + movq %rsp, 8(%rdi) + movq %rbp, 16(%rdi) + movq %rbx, 24(%rdi) + movq %r12, 32(%rdi) + movq %r13, 40(%rdi) + movq %r14, 48(%rdi) + movq %r15, 56(%rdi) + xorq %rax, %rax + jmpq *%rcx + +.global longjmp +longjmp: + movq (%rdi), %rcx + movq 8(%rdi), %rsp + movq 16(%rdi), %rbp + movq 24(%rdi), %rbx + movq 32(%rdi), %r12 + movq 40(%rdi), %r13 + movq 48(%rdi), %r14 + movq 56(%rdi), %r15 + + movq %rsi, %rax + testq %rax, %rax + jnz 1f + incq %rax +1: + jmpq *%rcx diff --git a/ulib/jump/jump.h b/ulib/jump/jump.h new file mode 100644 index 0000000..0ca8dfe --- /dev/null +++ b/ulib/jump/jump.h @@ -0,0 +1,23 @@ +#ifndef ULIB_JUMP_JUMP_H_ +#define ULIB_JUMP_JUMP_H_ + +#include +#include + +/* typedef struct { */ +/* uint64_t rip; */ +/* uint64_t rsp; */ +/* uint64_t rbp; */ +/* uint64_t rbx; */ +/* uint64_t r12; */ +/* uint64_t r13; */ +/* uint64_t r14; */ +/* uint64_t r15; */ +/* } JumpEnv; */ + +typedef uint64_t jmp_buf[8]; + +int setjmp(jmp_buf env); +void longjmp(jmp_buf env, int status); + +#endif // ULIB_JUMP_JUMP_H_ diff --git a/ulib/setjmp.h b/ulib/setjmp.h new file mode 100644 index 0000000..f4353ba --- /dev/null +++ b/ulib/setjmp.h @@ -0,0 +1,6 @@ +#ifndef ULIB_SETJMP_H_ +#define ULIB_SETJMP_H_ + +#include + +#endif // ULIB_SETJMP_H_