ducky.machine module

ducky.machine.Machine is the virtual machine. Each instance represents self-contained virtual machine, with all its devices, memory, CPUs and other necessary properties.

class ducky.machine.CommChannel(machine)[source]

Bases: object

create_queue(name)[source]
get_queue(name)[source]
unregister_queue(name)[source]
class ducky.machine.CommQueue(channel)[source]

Bases: object

is_empty_in()[source]
is_empty_out()[source]
read_in()[source]
read_out()[source]
write_in(o)[source]
write_out(o)[source]
class ducky.machine.EventBus(machine)[source]

Bases: object

add_listener(event, callback, *args, **kwargs)[source]
remove_listener(event, callback)[source]
trigger(event, *args, **kwargs)[source]
class ducky.machine.HaltMachineTask(machine)[source]

Bases: ducky.interfaces.IReactorTask

run()[source]
class ducky.machine.IRQRouterTask(machine)[source]

Bases: ducky.interfaces.IReactorTask

This task is responsible for distributing triggered IRQs between CPU cores. When IRQ is triggered, IRQ source (i.e. device that requires attention) is appended to this tasks queue (ducky.machine.IRQRouterTask.qeueu). As long as this queue is not empty, this task pops IRQ sources, selects free CPU core, and by calling its ducky.cpu.CPUCore.irq() method core takes reponsibility for executing interrupt routine.

Parameters:machine (ducky.machine.Machine) – machine this task belongs to.
run()[source]
class ducky.machine.Machine(logger=None, stdin=None, stdout=None, stderr=None)[source]

Bases: ducky.interfaces.ISnapshotable, ducky.interfaces.IMachineWorker

Virtual machine itself.

_do_tenh(printer, s, *args)[source]
boot()[source]
capture_state(suspend=False)[source]

Capture current state of the VM, and store it in it’s last_state attribute.

Parameters:suspend (bool) – if True, suspend VM before taking snapshot.
core(cid)[source]

Find CPU core by its string id.

Parameters:cid (string) – id of searched CPU core, in the form #<cpuid>:#<coreid>.
Return type:ducky.cpu.CPUCore
Returns:found core
Raises:ducky.errors.InvalidResourceError – when no such core exists.
cores

Get list of all cores in the machine.

Return type:list
Returns:list of ducky.cpu.CPUCore instances
die(exc)[source]
exit_code
get_device_by_name(name, klass=None)[source]

Get device by its name and class.

Parameters:
  • name (string) – name of the device.
  • klass (string) – if set, search only devices with this class.
Return type:

ducky.devices.Device

Returns:

found device

Raises:

ducky.errors.InvalidResourceError – when no such device exists

get_storage_by_id(sid)[source]

Get storage by its id.

Parameters:sid (int) – id of storage caller is looking for.
Return type:ducky.devices.Device
Returns:found device.
Raises:ducky.errors.InvalidResourceError – when no such storage exists.
halt()[source]
hw_setup(machine_config)[source]
load_state(state)[source]
on_core_alive(core)[source]

Signal machine that one of CPU cores is now alive.

on_core_halted(core)[source]

Signal machine that one of CPU cores is no longer alive.

run()[source]
save_state(parent)[source]
setup_devices()[source]
suspend()[source]
tenh(s, *args)[source]
trigger_irq(handler)[source]
wake_up()[source]
class ducky.machine.MachineState[source]

Bases: ducky.snapshot.SnapshotNode

get_cpu_state_by_id(cpuid)[source]
get_cpu_states()[source]
ducky.machine.cmd_boot(console, cmd)[source]

Setup HW, load binaries, init everything

ducky.machine.cmd_halt(console, cmd)[source]

Halt execution

ducky.machine.cmd_run(console, cmd)[source]

Start execution of loaded binaries

ducky.machine.cmd_snapshot(console, cmd)[source]

Create snapshot