From 613968dc302938beaa2d154f396817613ef83e2c Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jackpot51@gmail.com>
Date: Wed, 24 Aug 2022 11:39:31 -0600
Subject: [PATCH] Use push/pop scratch for x86 signal handler

---
 src/context/arch/x86.rs | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/src/context/arch/x86.rs b/src/context/arch/x86.rs
index ff541dfa..3d24a336 100644
--- a/src/context/arch/x86.rs
+++ b/src/context/arch/x86.rs
@@ -3,7 +3,9 @@ use core::sync::atomic::AtomicBool;
 
 use alloc::sync::Arc;
 
+use crate::{push_scratch, pop_scratch};
 use crate::gdt::{GDT, GDT_USER_FS, GDT_USER_GS};
+use crate::interrupt::handler::ScratchRegisters;
 use crate::paging::{RmmA, RmmArch, TableKind};
 use crate::syscall::FloatRegisters;
 
@@ -234,9 +236,7 @@ unsafe extern "cdecl" fn switch_to_inner() {
 #[allow(dead_code)]
 #[repr(packed)]
 pub struct SignalHandlerStack {
-    edx: usize,
-    ecx: usize,
-    eax: usize,
+    scratch: ScratchRegisters,
     handler: extern fn(usize),
     sig: usize,
     eip: usize,
@@ -251,22 +251,20 @@ unsafe extern "C" fn signal_handler_wrapper() {
 
     // Push scratch registers
     core::arch::asm!(
-        "
-            push eax
-            push ecx
-            push edx
-
+        concat!(
+            "push eax",
+            push_scratch!(),
+            "
             push esp
             call {inner}
             pop esp
-
-            pop edx
-            pop ecx
-            pop eax
+            ",
+            pop_scratch!(),
+            "
             add esp, 8
             ret
-        ",
-
+            ",
+        ),
         inner = sym inner,
         options(noreturn),
     );
-- 
GitLab