VirtualBox

source: vbox/trunk/src/VBox/Additions/3D/win/VBoxICD/icd_forwarders.py@ 95234

Last change on this file since 95234 was 93115, checked in by vboxsync, 3 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.3 KB
Line 
1"""
2Copyright (C) 2018-2022 Oracle Corporation
3
4This file is part of VirtualBox Open Source Edition (OSE), as
5available from http://www.virtualbox.org. This file is free software;
6you can redistribute it and/or modify it under the terms of the GNU
7General Public License (GPL) as published by the Free Software
8Foundation, in version 2 as it comes in the "COPYING" file of the
9VirtualBox OSE distribution. VirtualBox OSE is distributed in the
10hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
11"""
12
13import sys
14
15def GenerateForwarders():
16
17 # Get list of functions.
18 exports_file = open(sys.argv[1], "r")
19 if not exports_file:
20 print("Error: couldn't open %s file!" % filename)
21 sys.exit()
22
23 names = []
24 cbArgs = []
25 for line in exports_file.readlines():
26 line = line.strip()
27 if len(line) > 0 and line[0] != ';' and line != 'EXPORTS':
28 # Parse 'glAccum = glAccum@8'
29 words = line.split('=', 1)
30
31 # Function name
32 names.append(words[0].strip())
33
34 # Size of arguments in bytes
35 words = words[1].split('@')
36 cbArgs.append(words[1].strip())
37
38 exports_file.close()
39
40
41 #
42 # Assembler forwarders
43 #
44 asm_file = open(sys.argv[2], "w")
45 if not asm_file:
46 print("Error: couldn't open %s file!" % filename)
47 sys.exit()
48
49 asm_file.write('%include "iprt/asmdefs.mac"\n')
50 asm_file.write('\n')
51 asm_file.write(';;;; Enable ICD_LAZY_LOAD to lazy load the ICD DLL (does not work on Win64)\n')
52 asm_file.write('; %define ICD_LAZY_LOAD 1\n')
53 asm_file.write('\n')
54 asm_file.write('%ifdef RT_ARCH_AMD64\n')
55 asm_file.write('%define PTR_SIZE_PREFIX qword\n')
56 asm_file.write('%else ; X86\n')
57 asm_file.write('%define PTR_SIZE_PREFIX dword\n')
58 asm_file.write('%endif\n')
59 asm_file.write('\n')
60 asm_file.write('%ifdef ICD_LAZY_LOAD\n')
61 asm_file.write('extern NAME(VBoxLoadICD)\n')
62 asm_file.write('%endif\n')
63 asm_file.write('extern NAME(g_hmodICD)\n')
64
65 for index in range(len(names)):
66 fn = names[index]
67 cbRet = cbArgs[index]
68 asm_file.write('\n')
69 asm_file.write('BEGINPROC_EXPORTED %s\n' % fn)
70 asm_file.write(' extern NAME(pfn_%s)\n' % fn)
71 asm_file.write('; int3\n')
72 asm_file.write('%ifdef ICD_LAZY_LOAD\n')
73 asm_file.write(' mov xAX, PTR_SIZE_PREFIX NAME(g_hmodICD)\n')
74 asm_file.write(' mov xAX, [xAX]\n')
75 asm_file.write(' or xAX, xAX\n')
76 asm_file.write(' jnz l_icd_loaded_%s\n' % fn)
77 asm_file.write(' call NAME(VBoxLoadICD)\n')
78 asm_file.write('l_icd_loaded_%s:\n' % fn)
79 asm_file.write('%endif\n')
80 asm_file.write(' mov xAX, PTR_SIZE_PREFIX NAME(pfn_%s)\n' % fn)
81 asm_file.write(' mov xAX, [xAX]\n')
82 asm_file.write(' or xAX, xAX\n')
83 asm_file.write(' jnz l_jmp_to_%s\n' % fn)
84 asm_file.write('%ifdef RT_ARCH_AMD64\n')
85 asm_file.write(' ret\n')
86 asm_file.write('%else ; X86\n')
87 asm_file.write(' ret %s\n' % cbRet)
88 asm_file.write('%endif\n')
89 asm_file.write('l_jmp_to_%s:\n' % fn)
90 asm_file.write(' jmp xAX\n')
91 asm_file.write('ENDPROC %s\n' % fn)
92
93 asm_file.close()
94
95GenerateForwarders()
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette