raspberry pi linux userspace

This commit is contained in:
Triss 2022-01-29 20:49:50 +01:00
parent cb54b4d409
commit c7d52b0e74
1 changed files with 31 additions and 0 deletions

View File

@ -82,6 +82,22 @@ bytecode IDs that use a handler:
0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe
0xff is hardwired to bkpt #0
Raspberry Pi v1.2 B+, **Linux userspace**:
bytecode IDs that use a handler:
0x0f, 0x12, 0x13, 0x14, 0x62, 0x63, 0x66, 0x67, 0x6a, 0x6b, 0x6c, 0x6d,
0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x77, 0x79, 0x7b, 0x7d, 0x86, 0x87,
0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x95, 0x96, 0x97, 0x98,
0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbf, 0xc0, 0xc1, 0xc2,
0xc3, 0xc4, 0xc5, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc,
0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8,
0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4,
0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe
seems to be the same as FX3 except for 0x53 (aastore).
NOTE: baremetal is different, it is able to execute 0x6c (idiv) without problem!
*/
#ifdef __linux__
@ -295,8 +311,10 @@ static int jazelle_exec_native(const void* bytecode, const void* block) {
// libjz contradicts this...
// set configuration valid & jazelle enable bits
#if !defined(__linux__) || defined(__KERNEL__)
"mov r0, #2\n"
"mcr p14, 7, r0, c1, c0, 0\n"
#endif
"mov r0, #1\n"
"mcr p14, 7, r0, c2, c0, 0\n"
@ -319,8 +337,10 @@ static int jazelle_exec_native(const void* bytecode, const void* block) {
".Lend:\n"
"mov r5, #0\n"
#ifndef __linux__
"mcr p14, 7, %r5, c1, c0, 0\n"
"mcr p14, 7, %r5, c2, c0, 0\n"
#endif
"pop {r4-r12,lr}\n"
"bx lr\n"
@ -481,6 +501,17 @@ static void jazelle_test_handlers(uint8_t hflags[256/8]) {
hflags[i>>3]|=(1<<(i&7));
continue; // yeah
}
#ifdef __linux__
if (i == 0x2e) continue; // iaload, will do a random data load. avoid this in non baremetal contexts
if (i >= 0x2f && i <= 0x35) continue; // laload, faload, daload, aaload, baload, caload, saload
if (i >= 0x4f && i <= 0x56
#if __ARM_ARCH >= 6
&& i != 0x53
#endif
) continue; // [ilfdabcs]astore
if (i == 0xbe) continue; // arraylength
#endif
bytecode_testh[8] = i;
memset(&bytecode_testh[9], 0, 8);