From 71e41418f65fb2c69ce10df7fb15f9d71a8017de Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 17 Oct 2023 18:03:39 +0200 Subject: [PATCH] LibJS/JIT: Do "enter & leave" sequence in x86_64 machine code This ensures that the stack pointer is restored before we return from the jitted code. --- Userland/Libraries/LibJS/JIT/Assembler.h | 10 ++++++++++ Userland/Libraries/LibJS/JIT/Compiler.cpp | 2 ++ 2 files changed, 12 insertions(+) diff --git a/Userland/Libraries/LibJS/JIT/Assembler.h b/Userland/Libraries/LibJS/JIT/Assembler.h index bb13c42ee9..122c698589 100644 --- a/Userland/Libraries/LibJS/JIT/Assembler.h +++ b/Userland/Libraries/LibJS/JIT/Assembler.h @@ -290,8 +290,18 @@ struct Assembler { } } + void enter() + { + push(Operand::Register(Reg::RBP)); + mov(Operand::Register(Reg::RBP), Operand::Register(Reg::RSP)); + sub(Operand::Register(Reg::RSP), Operand::Imm8(8)); + } + void exit() { + // leave + emit8(0xc9); + // ret emit8(0xc3); } diff --git a/Userland/Libraries/LibJS/JIT/Compiler.cpp b/Userland/Libraries/LibJS/JIT/Compiler.cpp index 530288d82b..d8981eeabd 100644 --- a/Userland/Libraries/LibJS/JIT/Compiler.cpp +++ b/Userland/Libraries/LibJS/JIT/Compiler.cpp @@ -179,6 +179,8 @@ OwnPtr Compiler::compile(Bytecode::Executable const& bytecode_ Compiler compiler; + compiler.m_assembler.enter(); + compiler.m_assembler.mov( Assembler::Operand::Register(REGISTER_ARRAY_BASE), Assembler::Operand::Register(ARG1));