opuntiaOS - an operating system targeting x86 and ARMv7
at master 2.7 kB view raw
1# Copyright (C) 2020-2022 The opuntiaOS Project Authors. 2# + Contributed by Nikita Melekhin <nimelehin@gmail.com> 3# 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6 7from Generator.IRManager import IRManager 8from ABI.Structs import * 9from ABI.Translation import * 10 11 12class BinWriter(): 13 def __init__(self, irmng, output_file): 14 self.irmng = irmng 15 self.output_file = output_file 16 17 self.res_binarr = bytearray() 18 self.header_binarr = bytearray() 19 self.devs_binarr = bytearray() 20 self.names_binarr = bytearray() 21 22 def build_header(self): 23 count_of_devs = len(self.irmng.device_list()) 24 25 result = { 26 "signature": DEVTREE_HEADER_SIGNATURE, 27 "revision": 1, 28 "flags": 0, 29 "entries_count": count_of_devs, 30 "name_list_offset": DEVTREE_HEADER.sizeof() + len(self.devs_binarr), 31 } 32 33 self.header_binarr = DEVTREE_HEADER.build(result) 34 35 def build_dev(self, dev): 36 result = { 37 "type": 0, 38 "flags": 0, 39 "paddr": 0, 40 "rel_name_offset": len(self.names_binarr), 41 } 42 43 if "type" in dev: 44 result["type"] = Translator.entry_type(dev["type"]) 45 46 if "flags" in dev: 47 result["flags"] = Translator.entry_flags(dev["flags"]) 48 49 if "mem" in dev: 50 devmem = dev["mem"] 51 if "base" in devmem: 52 result["paddr"] = Translator.number(devmem["base"]) 53 54 self.devs_binarr += DEVTREE_ENTRY.build(result) 55 self.names_binarr += bytearray((map(ord, 56 dev["name"]))) + bytearray([0]) 57 58 def build_dev_list(self): 59 self.devs_binarr = bytearray() 60 self.names_binarr = bytearray() 61 for dev in self.irmng.device_list(): 62 self.build_dev(dev) 63 64 def build_binarr(self): 65 self.res_binarr = bytearray() 66 self.header_binarr = bytearray() 67 self.devs_binarr = bytearray() 68 self.names_binarr = bytearray() 69 70 self.build_dev_list() 71 self.build_header() 72 73 self.res_binarr = self.header_binarr + self.devs_binarr + self.names_binarr 74 # print("Header", self.header_binarr) 75 # print("Devs", self.devs_binarr) 76 # print("Names", self.names_binarr) 77 # print("Res", self.res_binarr) 78 79 def write_to_file(self): 80 binfile = open(self.output_file, "wb") 81 binfile.write(bytes(self.res_binarr)) 82 binfile.close() 83 84 def process(self): 85 if len(self.res_binarr) == 0: 86 self.build_binarr() 87 88 self.write_to_file()