X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/waydroid.git/blobdiff_plain/1f0393876d891d0e32a995d0bf7259cc6505afdc..refs/heads/electrikjesus-patch-1:/tools/helpers/drivers.py diff --git a/tools/helpers/drivers.py b/tools/helpers/drivers.py index e5a0335..3c0ea7a 100644 --- a/tools/helpers/drivers.py +++ b/tools/helpers/drivers.py @@ -3,6 +3,8 @@ import logging import os import glob +import fcntl +import struct import tools.config import tools.helpers.run @@ -10,19 +12,60 @@ import tools.helpers.run BINDER_DRIVERS = [ "anbox-binder", "puddlejumper", + "bonder", "binder" ] VNDBINDER_DRIVERS = [ "anbox-vndbinder", "vndpuddlejumper", + "vndbonder", "vndbinder" ] HWBINDER_DRIVERS = [ "anbox-hwbinder", "hwpuddlejumper", + "hwbonder", "hwbinder" ] + +def isBinderfsLoaded(args): + with open("/proc/filesystems", "r") as handle: + for line in handle: + words = line.split() + if len(words) >= 2 and words[1] == "binder": + return True + + return False + +def allocBinderNodes(args, binder_dev_nodes): + NRBITS = 8 + TYPEBITS = 8 + SIZEBITS = 14 + NRSHIFT = 0 + TYPESHIFT = NRSHIFT + NRBITS + SIZESHIFT = TYPESHIFT + TYPEBITS + DIRSHIFT = SIZESHIFT + SIZEBITS + WRITE = 0x1 + READ = 0x2 + + def IOC(direction, _type, nr, size): + return (direction << DIRSHIFT) | (_type << TYPESHIFT) | (nr << NRSHIFT) | (size << SIZESHIFT) + + def IOWR(_type, nr, size): + return IOC(READ|WRITE, _type, nr, size) + + BINDER_CTL_ADD = IOWR(98, 1, 264) + binderctrlfd = open('/dev/binderfs/binder-control','rb') + + for node in binder_dev_nodes: + node_struct = struct.pack( + '256sII', bytes(node, 'utf-8'), 0, 0) + try: + fcntl.ioctl(binderctrlfd.fileno(), BINDER_CTL_ADD, node_struct) + except FileExistsError: + pass + def probeBinderDriver(args): binder_dev_nodes = [] has_binder = False @@ -45,35 +88,32 @@ def probeBinderDriver(args): binder_dev_nodes.append(HWBINDER_DRIVERS[0]) if len(binder_dev_nodes) > 0: - devices = ','.join(binder_dev_nodes) - command = ["modprobe", "binder_linux", "devices=\"{}\"".format(devices)] - output = tools.helpers.run.root(args, command, check=False, output_return=True) - if output: - logging.error("Failed to load binder driver for devices: {}".format(devices)) - logging.error(output.strip()) - else: + if not isBinderfsLoaded(args): + devices = ','.join(binder_dev_nodes) + command = ["modprobe", "binder_linux", + "devices=\"{}\"".format(devices)] + output = tools.helpers.run.user(args, command, check=False, output_return=True) + if output: + logging.error("Failed to load binder driver") + logging.error(output.strip()) + + if isBinderfsLoaded(args): command = ["mkdir", "-p", "/dev/binderfs"] - tools.helpers.run.root(args, command, check=False) + tools.helpers.run.user(args, command, check=False) command = ["mount", "-t", "binder", "binder", "/dev/binderfs"] - tools.helpers.run.root(args, command, check=False) + tools.helpers.run.user(args, command, check=False) + allocBinderNodes(args, binder_dev_nodes) command = ["ln", "-s"] command.extend(glob.glob("/dev/binderfs/*")) command.append("/dev/") - tools.helpers.run.root(args, command, check=False) - - for node in binder_dev_nodes: - if not os.path.exists("/dev/" + node): - return -1 + tools.helpers.run.user(args, command, check=False) return 0 def probeAshmemDriver(args): if not os.path.exists("/dev/ashmem"): - command = ["modprobe", "ashmem_linux"] - output = tools.helpers.run.root(args, command, check=False, output_return=True) - if output: - logging.error("Failed to load ashmem driver") - logging.error(output.strip()) + command = ["modprobe", "-q", "ashmem_linux"] + tools.helpers.run.user(args, command, check=False) if not os.path.exists("/dev/ashmem"): return -1 @@ -133,3 +173,6 @@ def loadBinderNodes(args): args.BINDER_DRIVER = cfg["waydroid"]["binder"] args.VNDBINDER_DRIVER = cfg["waydroid"]["vndbinder"] args.HWBINDER_DRIVER = cfg["waydroid"]["hwbinder"] + # These might not be in cfg on package upgrade + args.BINDER_PROTOCOL = cfg["waydroid"].get("binder_protocol") + args.SERVICE_MANAGER_PROTOCOL = cfg["waydroid"].get("service_manager_protocol")