| Index: embios/trunk/tools/embios.py | 
| — | — | @@ -144,7 +144,7 @@ | 
| 145 | 145 | Decorator for all commands. | 
| 146 | 146 | The decorated function is called with (self, all, other, arguments, ...) | 
| 147 | 147 | """ | 
| 148 |  | -    def decorator(args):
 | 
|  | 148 | +    def decorator(*args): | 
| 149 | 149 | return func(args[0], *args[1:]) | 
| 150 | 150 | func._command = True | 
| 151 | 151 | decorator.func = func | 
| — | — | @@ -180,6 +180,7 @@ | 
| 181 | 181 | except libembios.DeviceNotFoundError: | 
| 182 | 182 | self.logger.error("No emBIOS device found!") | 
| 183 | 183 | end(1) | 
|  | 184 | +        self.getinfo("version") | 
| 184 | 185 |  | 
| 185 | 186 | def _parsecommand(self, func, args): | 
| 186 | 187 | # adds self to the commandline args. | 
| — | — | @@ -187,7 +188,7 @@ | 
| 188 | 189 | args.insert(0, self) | 
| 189 | 190 | if func in self.cmddict: | 
| 190 | 191 | try: | 
| 191 |  | -                self.cmddict[func](args)
 | 
|  | 192 | +                self.cmddict[func](*args) | 
| 192 | 193 | except ArgumentError, e: | 
| 193 | 194 | usage(e) | 
| 194 | 195 | except ArgumentError: | 
| — | — | @@ -196,6 +197,8 @@ | 
| 197 | 198 | usage(e) | 
| 198 | 199 | except NotImplementedError: | 
| 199 | 200 | self.logger.error("This function is not implemented yet!") | 
|  | 201 | +            except libembios.DeviceNotFoundError: | 
|  | 202 | +                self.logger.error("Device not found!") | 
| 200 | 203 | except libembios.DeviceError, e: | 
| 201 | 204 | self.logger.error(str(e)) | 
| 202 | 205 | except TypeError, e: | 
| — | — | @@ -263,7 +266,7 @@ | 
| 264 | 267 | """ | 
| 265 | 268 | if infotype == "version": | 
| 266 | 269 | resp = self.embios.getversioninfo() | 
| 267 |  | -            self.logger.info(libembiosdata.swtypes[resp.swtypeid] + " v" + str(resp.majorv) + "." + str(resp.minorv) +
 | 
|  | 270 | +            self.logger.info("Connected to "+libembiosdata.swtypes[resp.swtypeid] + " v" + str(resp.majorv) + "." + str(resp.minorv) + | 
| 268 | 271 | "." + str(resp.patchv) + " r" + str(resp.revision) + " running on " + libembiosdata.hwtypes[resp.hwtypeid] + "\n") | 
| 269 | 272 | elif infotype == "packetsize": | 
| 270 | 273 | resp = self.embios.getpacketsizeinfo() | 
| — | — | @@ -546,14 +549,35 @@ | 
| 547 | 550 | stacksize = self._hexint(stacksize) | 
| 548 | 551 | priority = self._hexint(priority) | 
| 549 | 552 | self.embios.createthread(nameptr, entrypoint, stackptr, stacksize, type, priority, state) | 
|  | 553 | + | 
|  | 554 | +    @command | 
|  | 555 | +    def run(self, filename): | 
|  | 556 | +        """ | 
|  | 557 | +            Uploads the emBIOS application to an address in the user memory | 
|  | 558 | +            and executes it | 
|  | 559 | +        """ | 
|  | 560 | +        try: | 
|  | 561 | +            f = open(filename, "rb") | 
|  | 562 | +        except IOError: | 
|  | 563 | +            raise ArgumentError("File not readable. Does it exist?") | 
|  | 564 | +        data = self.embios.getusermemrange() | 
|  | 565 | +        addr = data.lower | 
|  | 566 | +        maxsize = data.upper - data.lower | 
|  | 567 | +        filesize = os.path.getsize(filename) | 
|  | 568 | +        if filesize > maxsize: | 
|  | 569 | +            raise ArgumentError("The file is too big, it doesn't fit into the user memory.") | 
|  | 570 | +        self.logger.info("Uploading application to "+hex(addr)+" - "+hex(addr+filesize)+"\n") | 
|  | 571 | +        self.embios.write(addr, f.read()) | 
|  | 572 | +        self.execute(addr) | 
| 550 | 573 |  | 
| 551 | 574 | @command | 
| 552 |  | -    def run(self, address):
 | 
|  | 575 | +    def execute(self, addr): | 
| 553 | 576 | """ | 
| 554 | 577 | Executes the emBIOS application at <address>. | 
| 555 | 578 | """ | 
| 556 |  | -        address = self._hexint(address)
 | 
| 557 |  | -        raise NotImplementedError
 | 
|  | 579 | +        addr = self._hexint(addr) | 
|  | 580 | +        self.logger.info("Starting emBIOS app at "+hex(addr)+"\n") | 
|  | 581 | +        self.embios.execimage(addr) | 
| 558 | 582 |  | 
| 559 | 583 | @command | 
| 560 | 584 | def readrawbootflash(self, addr_flash, addr_mem, size): | 
| — | — | @@ -586,12 +610,14 @@ | 
| 587 | 611 | """ | 
| 588 | 612 | Flushes the CPUs data and instruction caches. | 
| 589 | 613 | """ | 
| 590 |  | -        raise NotImplementedError
 | 
|  | 614 | +        self.logger.info("Flushing CPU data and instruction caches...") | 
|  | 615 | +        self.embios.flushcaches() | 
|  | 616 | +        self.logger.info("done\n") | 
| 591 | 617 |  | 
| 592 | 618 | @command | 
| 593 | 619 | def aesencrypt(self, addr, size, keyindex): | 
| 594 | 620 | """ | 
| 595 |  | -            Encrypt a buffer using a hardware key
 | 
|  | 621 | +            Encrypts a buffer using a hardware key | 
| 596 | 622 | """ | 
| 597 | 623 | addr = self._hexint(addr) | 
| 598 | 624 | size = self._hexint(size) | 
| — | — | @@ -601,12 +627,29 @@ | 
| 602 | 628 | @command | 
| 603 | 629 | def aesdecrypt(self, addr, size, keyindex): | 
| 604 | 630 | """ | 
| 605 |  | -            Decrypt a buffer using a hardware key
 | 
|  | 631 | +            Decrypts a buffer using a hardware key | 
| 606 | 632 | """ | 
| 607 | 633 | addr = self._hexint(addr) | 
| 608 | 634 | size = self._hexint(size) | 
| 609 | 635 | keyindex = self._hexint(keyindex) | 
| 610 | 636 | self.embios.aesdecrypt(addr, size, keyindex) | 
|  | 637 | + | 
|  | 638 | +    @command | 
|  | 639 | +    def hmac_sha1(self, addr, size, destination): | 
|  | 640 | +        """ | 
|  | 641 | +            Generates a HMAC-SHA1 hash of the buffer and saves it to 'destination' | 
|  | 642 | +        """ | 
|  | 643 | +        addr = self._hexint(addr) | 
|  | 644 | +        size = self._hexint(size) | 
|  | 645 | +        destination = self._hexint(destination) | 
|  | 646 | +        sha1size = 0x14 | 
|  | 647 | +        self.logger.info("Generating hmac-sha1 hash from the buffer at "+hex(addr)+" with the size "+hex(size)+ | 
|  | 648 | +                         " and saving it to "+hex(destination)+" - "+hex(destination+sha1size)+"...") | 
|  | 649 | +        self.embios.hmac_sha1(addr, size, destination) | 
|  | 650 | +        self.logger.info("done\n") | 
|  | 651 | +        data = self.embios.readmem(destination, sha1size) | 
|  | 652 | +        hash = ord(data) | 
|  | 653 | +        self.logger.info("The generated hash is "+hex(hash)) | 
| 611 | 654 |  | 
| 612 | 655 | if __name__ == "__main__": | 
| 613 | 656 | if len(sys.argv) < 2: | 
| Index: embios/trunk/tools/libembios.py | 
| — | — | @@ -269,11 +269,11 @@ | 
| 270 | 270 | raise DeviceError("The device returned the error code "+str(resp.id)) | 
| 271 | 271 | return resp | 
| 272 | 272 |  | 
| 273 |  | -    def flushcpucache(self):
 | 
|  | 273 | +    def flushcaches(self): | 
| 274 | 274 | """ Flushes the CPU instruction and data cache """ | 
| 275 | 275 | return self.lib.monitorcommand(struct.pack("IIII", 20, 0, 0, 0), "III", (None, None, None)) | 
| 276 | 276 |  | 
| 277 |  | -    def run(self, addr):
 | 
|  | 277 | +    def execimage(self, addr): | 
| 278 | 278 | """ Runs the emBIOS app at 'addr' """ | 
| 279 | 279 | return self.lib.monitorcommand(struct.pack("IIII", 21, addr, 0, 0), "III", ("excecimage", None, None)) | 
| 280 | 280 |  |