blob: 2493f351bc65e6c5e9a05cdc3261beeb38924d8b [file] [log] [blame]
#!/usr/bin/env python
# Work around x86emu bugs by replacing problematic instructions.
# Copyright (C) 2012 Kevin O'Connor <>
# This file may be distributed under the terms of the GNU GPLv3 license.
# The x86emu code widely used in Linux distributions when running Xorg
# in vesamode is known to have issues with "retl", "leavel", "entryl",
# and some variants of "calll". This code modifies those instructions
# (ret and leave) that are known to be generated by gcc to avoid
# triggering the x86emu bugs.
# It is also known that the Windows vgabios emulator has issues with
# addressing negative offsets to the %esp register. That has been
# worked around by not using the gcc parameter "-fomit-frame-pointer"
# when compiling.
import sys
def main():
infilename, outfilename = sys.argv[1:]
infile = open(infilename, 'rb')
out = []
for line in infile:
sline = line.strip()
if sline == 'ret':
out.append('retw $2\n')
elif sline == 'leave':
out.append('movl %ebp, %esp ; popl %ebp\n')
elif sline.startswith('call'):
out.append('pushw %ax ; callw' + sline[4:] + '\n')
outfile = open(outfilename, 'wb')
if __name__ == '__main__':