about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-01-01 00:00:08 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-01-01 00:00:08 +0100
commit6e77ce999a49c85fb8a6dc378993d37c3557784c (patch)
treedd6bf8ac68a094666eea05c11e4ed32197116203 /src
parentdd05eeb821946d4a8ff639e5dff3be8566d462f8 (diff)
downloadbox64-6e77ce999a49c85fb8a6dc378993d37c3557784c.tar.gz
box64-6e77ce999a49c85fb8a6dc378993d37c3557784c.zip
[ARM64] Improved fast path for unaligned access to device memory (for NVidia cards)
Diffstat (limited to 'src')
-rw-r--r--src/libtools/signals.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index 856a5b55..cc9c4968 100644
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -574,7 +574,7 @@ int sigbus_specialcases(siginfo_t* info, void * ucntx, void* pc, void* _fpsimd)
         uint64_t value = p->uc_mcontext.regs[val];
         if(scale==3 && (((uintptr_t)addr)&3)==0) {
             for(int i=0; i<2; ++i)
-                ((uint32_t*)addr)[i] = (value>>(i*32))&0xffffffff;
+                ((volatile uint32_t*)addr)[i] = (value>>(i*32))&0xffffffff;
         } else
             for(int i=0; i<(1<<scale); ++i)
                 addr[i] = (value>>(i*8))&0xff;
@@ -593,7 +593,7 @@ int sigbus_specialcases(siginfo_t* info, void * ucntx, void* pc, void* _fpsimd)
         uint64_t value = p->uc_mcontext.regs[val];
         if(size==8 && (((uintptr_t)addr)&3)==0) {
             for(int i=0; i<2; ++i)
-                ((uint32_t*)addr)[i] = (value>>(i*32))&0xffffffff;
+                ((volatile uint32_t*)addr)[i] = (value>>(i*32))&0xffffffff;
         } else
             for(int i=0; i<size; ++i)
                 addr[i] = (value>>(i*8))&0xff;
@@ -617,7 +617,7 @@ int sigbus_specialcases(siginfo_t* info, void * ucntx, void* pc, void* _fpsimd)
         __uint128_t value = fpsimd->vregs[val];
         if(scale>2 && (((uintptr_t)addr)&3)==0) {
             for(int i=0; i<(1<<(scale-2)); ++i)
-                ((uint32_t*)addr)[i] = (value>>(i*32))&0xffffffff;
+                ((volatile uint32_t*)addr)[i] = (value>>(i*32))&0xffffffff;
         } else
             for(int i=0; i<(1<<scale); ++i)
                 addr[i] = (value>>(i*8))&0xff;
@@ -642,7 +642,7 @@ int sigbus_specialcases(siginfo_t* info, void * ucntx, void* pc, void* _fpsimd)
         __uint128_t value = fpsimd->vregs[val];
         if(scale>2 && (((uintptr_t)addr)&3)==0) {
             for(int i=0; i<(1<<(scale-2)); ++i)
-                ((uint32_t*)addr)[i] = (value>>(i*32))&0xffffffff;
+                ((volatile uint32_t*)addr)[i] = (value>>(i*32))&0xffffffff;
         } else
             for(int i=0; i<(1<<scale); ++i)
                 addr[i] = (value>>(i*8))&0xff;
@@ -666,7 +666,7 @@ int sigbus_specialcases(siginfo_t* info, void * ucntx, void* pc, void* _fpsimd)
         __uint128_t value = 0;
         if(scale>2 && (((uintptr_t)addr)&3)==0) {
             for(int i=0; i<(1<<(scale-2)); ++i)
-                value |= ((__uint128_t)(((uint32_t*)addr)[i]))<<(i*32);
+                value |= ((__uint128_t)(((volatile uint32_t*)addr)[i]))<<(i*32);
         } else
             for(int i=0; i<(1<<scale); ++i)
                 value |= ((__uint128_t)addr[i])<<(i*8);
@@ -692,7 +692,7 @@ int sigbus_specialcases(siginfo_t* info, void * ucntx, void* pc, void* _fpsimd)
         __uint128_t value = 0;
         if(scale>2 && (((uintptr_t)addr)&3)==0) {
             for(int i=0; i<(1<<(scale-2)); ++i)
-                value |= ((__uint128_t)(((uint32_t*)addr)[i]))<<(i*32);
+                value |= ((__uint128_t)(((volatile  uint32_t*)addr)[i]))<<(i*32);
         } else
             for(int i=0; i<(1<<scale); ++i)
                 value |= ((__uint128_t)addr[i])<<(i*8);
@@ -711,7 +711,7 @@ int sigbus_specialcases(siginfo_t* info, void * ucntx, void* pc, void* _fpsimd)
         uint64_t value = 0;
         if(scale==3 && (((uintptr_t)addr)&3)==0) {
             for(int i=0; i<2; ++i)
-                value |= ((uint64_t)((uint32_t*)addr)[i]) << (i*32);
+                value |= ((uint64_t)((volatile  uint32_t*)addr)[i]) << (i*32);
         } else
             for(int i=0; i<(1<<scale); ++i)
                 value |= ((uint64_t)addr[i]) << (i*8);
@@ -731,7 +731,7 @@ int sigbus_specialcases(siginfo_t* info, void * ucntx, void* pc, void* _fpsimd)
         uint64_t value = 0;
         if(size==8 && (((uintptr_t)addr)&3)==0) {
             for(int i=0; i<2; ++i)
-                value |= ((uint64_t)((uint32_t*)addr)[i]) << (i*32);
+                value |= ((uint64_t)((volatile  uint32_t*)addr)[i]) << (i*32);
         } else
             for(int i=0; i<size; ++i)
                 value |= ((uint64_t)addr[i]) << (i*8);