--- configure.py
+++ configure.py
@@ -848,7 +848,7 @@ def host_arch_cc():
     '__MIPSEL__'  : 'mipsel',
     '__mips__'    : 'mips',
     '__PPC64__'   : 'ppc64',
-    '__PPC__'     : 'ppc64',
+    '__PPC__'     : 'ppc',
     '__x86_64__'  : 'x64',
     '__s390__'    : 's390',
     '__s390x__'   : 's390x',
--- node.gyp
+++ node.gyp
@@ -479,6 +479,11 @@
       'msvs_disabled_warnings!': [4244],
 
       'conditions': [
+        [ 'host_arch=="mips" or host_arch=="mipsel" or host_arch=="ppc"', {
+	  'link_settings': {
+	    'libraries': [ '-latomic' ],
+	  },
+	}],
         [ 'node_code_cache_path!=""', {
           'sources': [ '<(node_code_cache_path)' ]
         }, {
--- deps/v8/src/libsampler/sampler.cc
+++ deps/v8/src/libsampler/sampler.cc
@@ -418,9 +418,15 @@ void SignalHandler::FillRegisterState(void* context, RegisterState* state) {
       reinterpret_cast<void*>(ucontext->uc_mcontext.regs->gpr[PT_R31]);
 #else
   // Some C libraries, notably Musl, define the regs member as a void pointer
+  #if !V8_TARGET_ARCH_32_BIT
   state->pc = reinterpret_cast<void*>(ucontext->uc_mcontext.gp_regs[32]);
   state->sp = reinterpret_cast<void*>(ucontext->uc_mcontext.gp_regs[1]);
   state->fp = reinterpret_cast<void*>(ucontext->uc_mcontext.gp_regs[31]);
+  #else
+  state->pc = reinterpret_cast<void*>(ucontext->uc_mcontext.gregs[32]);
+  state->sp = reinterpret_cast<void*>(ucontext->uc_mcontext.gregs[1]);
+  state->fp = reinterpret_cast<void*>(ucontext->uc_mcontext.gregs[31]);
+  #endif
 #endif
 #elif V8_HOST_ARCH_S390
 #if V8_TARGET_ARCH_32_BIT
