]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/helpers/drivers.py
net: Disable NFT by default
[waydroid.git] / tools / helpers / drivers.py
1 # Copyright 2021 Erfan Abdi
2 # SPDX-License-Identifier: GPL-3.0-or-later
3 import logging
4 import os
5 import glob
6 import fcntl
7 import struct
8 import tools.config
9 import tools.helpers.run
10
11
12 BINDER_DRIVERS = [
13 "anbox-binder",
14 "puddlejumper",
15 "binder"
16 ]
17 VNDBINDER_DRIVERS = [
18 "anbox-vndbinder",
19 "vndpuddlejumper",
20 "vndbinder"
21 ]
22 HWBINDER_DRIVERS = [
23 "anbox-hwbinder",
24 "hwpuddlejumper",
25 "hwbinder"
26 ]
27
28
29 def isBinderfsLoaded(args):
30 with open("/proc/filesystems", "r") as handle:
31 for line in handle:
32 words = line.split()
33 if len(words) >= 2 and words[1] == "binder":
34 return True
35
36 return False
37
38 def allocBinderNodes(args, binder_dev_nodes):
39 NRBITS = 8
40 TYPEBITS = 8
41 SIZEBITS = 14
42 NRSHIFT = 0
43 TYPESHIFT = NRSHIFT + NRBITS
44 SIZESHIFT = TYPESHIFT + TYPEBITS
45 DIRSHIFT = SIZESHIFT + SIZEBITS
46 WRITE = 0x1
47 READ = 0x2
48
49 def IOC(direction, _type, nr, size):
50 return (direction << DIRSHIFT) | (_type << TYPESHIFT) | (nr << NRSHIFT) | (size << SIZESHIFT)
51
52 def IOWR(_type, nr, size):
53 return IOC(READ|WRITE, _type, nr, size)
54
55 BINDER_CTL_ADD = IOWR(98, 1, 264)
56 binderctrlfd = open('/dev/binderfs/binder-control','rb')
57
58 for node in binder_dev_nodes:
59 node_struct = struct.pack(
60 '256sII', bytes(node, 'utf-8'), 0, 0)
61 try:
62 fcntl.ioctl(binderctrlfd.fileno(), BINDER_CTL_ADD, node_struct)
63 except FileExistsError:
64 pass
65
66 def probeBinderDriver(args):
67 binder_dev_nodes = []
68 has_binder = False
69 has_vndbinder = False
70 has_hwbinder = False
71 for node in BINDER_DRIVERS:
72 if os.path.exists("/dev/" + node):
73 has_binder = True
74 if not has_binder:
75 binder_dev_nodes.append(BINDER_DRIVERS[0])
76 for node in VNDBINDER_DRIVERS:
77 if os.path.exists("/dev/" + node):
78 has_vndbinder = True
79 if not has_vndbinder:
80 binder_dev_nodes.append(VNDBINDER_DRIVERS[0])
81 for node in HWBINDER_DRIVERS:
82 if os.path.exists("/dev/" + node):
83 has_hwbinder = True
84 if not has_hwbinder:
85 binder_dev_nodes.append(HWBINDER_DRIVERS[0])
86
87 if len(binder_dev_nodes) > 0:
88 if not isBinderfsLoaded(args):
89 devices = ','.join(binder_dev_nodes)
90 command = ["modprobe", "binder_linux",
91 "devices=\"{}\"".format(devices)]
92 output = tools.helpers.run.user(args, command, check=False, output_return=True)
93 if output:
94 logging.error("Failed to load binder driver")
95 logging.error(output.strip())
96
97 if isBinderfsLoaded(args):
98 command = ["mkdir", "-p", "/dev/binderfs"]
99 tools.helpers.run.user(args, command, check=False)
100 command = ["mount", "-t", "binder", "binder", "/dev/binderfs"]
101 tools.helpers.run.user(args, command, check=False)
102 allocBinderNodes(args, binder_dev_nodes)
103 command = ["ln", "-s"]
104 command.extend(glob.glob("/dev/binderfs/*"))
105 command.append("/dev/")
106 tools.helpers.run.user(args, command, check=False)
107
108 return 0
109
110 def probeAshmemDriver(args):
111 if not os.path.exists("/dev/ashmem"):
112 command = ["modprobe", "ashmem_linux"]
113 output = tools.helpers.run.user(args, command, check=False, output_return=True)
114 if output:
115 logging.error("Failed to load ashmem driver")
116 logging.error(output.strip())
117
118 if not os.path.exists("/dev/ashmem"):
119 return -1
120
121 return 0
122
123 def setupBinderNodes(args):
124 has_binder = False
125 has_vndbinder = False
126 has_hwbinder = False
127 if args.vendor_type == "MAINLINE":
128 probeBinderDriver(args)
129 for node in BINDER_DRIVERS:
130 if os.path.exists("/dev/" + node):
131 has_binder = True
132 args.BINDER_DRIVER = node
133 if not has_binder:
134 raise OSError('Binder node "binder" for waydroid not found')
135
136 for node in VNDBINDER_DRIVERS:
137 if os.path.exists("/dev/" + node):
138 has_vndbinder = True
139 args.VNDBINDER_DRIVER = node
140 if not has_vndbinder:
141 raise OSError('Binder node "vndbinder" for waydroid not found')
142
143 for node in HWBINDER_DRIVERS:
144 if os.path.exists("/dev/" + node):
145 has_hwbinder = True
146 args.HWBINDER_DRIVER = node
147 if not has_hwbinder:
148 raise OSError('Binder node "hwbinder" for waydroid not found')
149 else:
150 for node in BINDER_DRIVERS[:-1]:
151 if os.path.exists("/dev/" + node):
152 has_binder = True
153 args.BINDER_DRIVER = node
154 if not has_binder:
155 raise OSError('Binder node "binder" for waydroid not found')
156
157 for node in VNDBINDER_DRIVERS[:-1]:
158 if os.path.exists("/dev/" + node):
159 has_vndbinder = True
160 args.VNDBINDER_DRIVER = node
161 if not has_vndbinder:
162 raise OSError('Binder node "vndbinder" for waydroid not found')
163
164 for node in HWBINDER_DRIVERS[:-1]:
165 if os.path.exists("/dev/" + node):
166 has_hwbinder = True
167 args.HWBINDER_DRIVER = node
168 if not has_hwbinder:
169 raise OSError('Binder node "hwbinder" for waydroid not found')
170
171 def loadBinderNodes(args):
172 cfg = tools.config.load(args)
173 args.BINDER_DRIVER = cfg["waydroid"]["binder"]
174 args.VNDBINDER_DRIVER = cfg["waydroid"]["vndbinder"]
175 args.HWBINDER_DRIVER = cfg["waydroid"]["hwbinder"]