Skip to content

Commit

Permalink
ppc64,alpha,sparc,sw_64 generated by chatgpt
Browse files Browse the repository at this point in the history
  • Loading branch information
coolxv committed Jun 6, 2024
1 parent 5a42bab commit 7ee41b7
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 10 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/make-test-multi-platform.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ jobs:
compiler: clang
- os: macos-latest
compiler: clang
- os: macos-14
compiler: clang
# - os: macos-14
# compiler: clang
steps:
- uses: actions/checkout@v4

Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
* [x] riscv64
* [x] loongarch64
* [x] mips64
* [ ] ppc64
* [ ] alpha
* [ ] sparc
* [ ] sw_64
* [x] ppc64 (Generated by chatgpt and requires verification)
* [x] alpha (Generated by chatgpt and requires verification)
* [x] sparc (Generated by chatgpt and requires verification)
* [x] sw_64 (Generated by chatgpt and requires verification)
- Supported compiler:
* [x] msvc
* [x] gcc
Expand Down
8 changes: 4 additions & 4 deletions README_zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
* [x] riscv64
* [x] loongarch64
* [x] mips64
* [ ] ppc64
* [ ] alpha
* [ ] sparc
* [ ] sw_64
* [x] ppc64 (由chatgpt 生成,需要验证)
* [x] alpha (由chatgpt 生成,需要验证)
* [x] sparc (由chatgpt 生成,需要验证)
* [x] sw_64 (由chatgpt 生成,需要验证n)

- 支持的编译器 :
* [x] msvc
Expand Down
60 changes: 60 additions & 0 deletions src/stub.h
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,66 @@
*(unsigned long long*)(fn + 12) = (unsigned long long)fn_stub;\
CACHEFLUSH((char *)fn, CODESIZE);
#define REPLACE_NEAR(t, fn, fn_stub) REPLACE_FAR(t, fn, fn_stub)
#elif defined(__powerpc64__)
#define CODESIZE 20U
#define CODESIZE_MIN 20U
#define CODESIZE_MAX CODESIZE
// lis r12, fn_stub@highest
// ori r12, r12, fn_stub@higher
// rldicr r12, r12, 32, 31
// ori r12, r12, fn_stub@high
// ori r12, r12, fn_stub@l
// mtctr r12
// bctr
#define REPLACE_FAR(t, fn, fn_stub)\
((uint32_t*)fn)[0] = 0x3c000000 | (((uintptr_t)fn_stub >> 48) & 0xffff);\
((uint32_t*)fn)[1] = 0x60000000 | (((uintptr_t)fn_stub >> 32) & 0xffff);\
((uint32_t*)fn)[2] = 0x78000000 | ((((uintptr_t)fn_stub >> 32) & 0xffff) << 16);\
((uint32_t*)fn)[3] = 0x60000000 | (((uintptr_t)fn_stub >> 16) & 0xffff);\
((uint32_t*)fn)[4] = 0x60000000 | ((uintptr_t)fn_stub & 0xffff);\
((uint32_t*)fn)[5] = 0x7d8903a6;\
((uint32_t*)fn)[6] = 0x4e800420;\
CACHEFLUSH((char *)fn, CODESIZE);
#define REPLACE_NEAR(t, fn, fn_stub) REPLACE_FAR(t, fn, fn_stub)
#elif defined(__alpha__)
#define CODESIZE 16U
#define CODESIZE_MIN 16U
#define CODESIZE_MAX CODESIZE
// ldah t12, high(fn_stub)
// lda t12, low(fn_stub)(t12)
// jmp zero, (t12), 0
#define REPLACE_FAR(t, fn, fn_stub)\
((uint32_t*)fn)[0] = 0x279f0000 | (((uintptr_t)fn_stub >> 32) & 0xffff);\
((uint32_t*)fn)[1] = 0x201f0000 | ((uintptr_t)fn_stub & 0xffff);\
((uint32_t*)fn)[2] = 0x6bfb0000;\
CACHEFLUSH((char *)fn, CODESIZE);
#define REPLACE_NEAR(t, fn, fn_stub) REPLACE_FAR(t, fn, fn_stub)
#elif defined(__sparc__) && defined(__arch64__)
#define CODESIZE 24U
#define CODESIZE_MIN 24U
#define CODESIZE_MAX CODESIZE
// sethi %hi(fn_stub), %g1
// jmp %g1 + %lo(fn_stub)
// nop
#define REPLACE_FAR(t, fn, fn_stub)\
((uint32_t*)fn)[0] = 0x03000000 | (((uintptr_t)fn_stub >> 42) & 0x3fffff);\
((uint32_t*)fn)[1] = 0x81c06000 | (((uintptr_t)fn_stub >> 32) & 0x3ff);\
((uint32_t*)fn)[2] = 0x01000000;\
CACHEFLUSH((char *)fn, CODESIZE);
#define REPLACE_NEAR(t, fn, fn_stub) REPLACE_FAR(t, fn, fn_stub)
#elif defined(__sw_64__)
#define CODESIZE 12U
#define CODESIZE_MIN 12U
#define CODESIZE_MAX CODESIZE
// bis zero, zero, v0
// ldq v0, fn_stub
// jmp zero, (v0)
#define REPLACE_FAR(t, fn, fn_stub)\
((uint32_t*)fn)[0] = 0x20000000;\
((uint32_t*)fn)[1] = 0xd2000000 | ((uintptr_t)fn_stub & 0xffffffff);\
((uint32_t*)fn)[2] = 0x6bfb0000;\
CACHEFLUSH((char *)fn, CODESIZE);
#define REPLACE_NEAR(t, fn, fn_stub) REPLACE_FAR(t, fn, fn_stub)
#else //__i386__ _x86_64__ _M_IX86 _M_X64
#define CODESIZE 13U
#define CODESIZE_MIN 5U
Expand Down

0 comments on commit 7ee41b7

Please sign in to comment.