[pyjailhouse 1/2] Create pyjailhouse module

27 views
Skip to first unread message

Christopher Goldsworthy

unread,
May 19, 2018, 8:53:39 AM5/19/18
to jailho...@googlegroups.com, Christopher Goldsworthy
Create a project folder jailhouse/python_module and related files, such that
any python package placed in here is installable by pip

Create a python package jailhouse/python_module/pyjailhouse, move JailhouseCell
class used in jailhouse/tools/jailhouse-cell-linux into
jailhouse/python_module/pyjailhouse/cell.py, import JailhouseCell from cell.py
when in jailhouse-cell-linux

Install pyjailhouse using pip when running `make install`

Add .pyc files to .gitignore

Signed-off-by: Chris Goldsworthy <christopher...@outlook.com>
---
.gitignore | 1 +
Makefile | 3 +++
python_module/pyjailhouse/__init__.py | 0
python_module/pyjailhouse/cell.py | 49 +++++++++++++++++++++++++++++++++++
python_module/setup.py | 15 +++++++++++
tools/jailhouse-cell-linux | 39 ++--------------------------
6 files changed, 70 insertions(+), 37 deletions(-)
create mode 100644 python_module/pyjailhouse/__init__.py
create mode 100644 python_module/pyjailhouse/cell.py
create mode 100644 python_module/setup.py

diff --git a/.gitignore b/.gitignore
index 8bd7a16..36bee48 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,3 +26,4 @@ hypervisor/arch/*/include/generated
*.s
ci/out
ci/*.tar.xz
+*.pyc
diff --git a/Makefile b/Makefile
index ce19d1a..1028098 100644
--- a/Makefile
+++ b/Makefile
@@ -48,8 +48,11 @@ firmware_install: $(DESTDIR)$(firmwaredir) modules
tool_inmates_install: $(DESTDIR)$(libexecdir)/jailhouse
$(INSTALL_DATA) inmates/tools/$(ARCH)/*.bin $<

+# --upgrade forces a re-install, if package is already installed
install: modules_install firmware_install tool_inmates_install
$(Q)$(MAKE) -C tools $@ src=.
+ pip install --upgrade ./python_module
+

.PHONY: modules_install install clean firmware_install modules tools docs \
docs_clean
diff --git a/python_module/pyjailhouse/__init__.py b/python_module/pyjailhouse/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/python_module/pyjailhouse/cell.py b/python_module/pyjailhouse/cell.py
new file mode 100644
index 0000000..20e8848
--- /dev/null
+++ b/python_module/pyjailhouse/cell.py
@@ -0,0 +1,49 @@
+
+# Jailhouse, a Linux-based partitioning hypervisor
+#
+# Copyright (c) Siemens AG, 2015-2016
+#
+# Authors:
+# Jan Kiszka <jan.k...@siemens.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2. See
+# the COPYING file in the top-level directory.
+
+import ctypes
+import errno
+import fcntl
+import struct
+
+
+class JailhouseCell:
+ JAILHOUSE_CELL_CREATE = 0x40100002
+ JAILHOUSE_CELL_LOAD = 0x40300003
+ JAILHOUSE_CELL_START = 0x40280004
+
+ JAILHOUSE_CELL_ID_UNUSED = -1
+
+ def __init__(self, config):
+ self.name = config.name.encode()
+
+ self.dev = open('/dev/jailhouse')
+
+ cbuf = ctypes.c_buffer(config.data)
+ create = struct.pack('QI4x', ctypes.addressof(cbuf), len(config.data))
+ try:
+ fcntl.ioctl(self.dev, JailhouseCell.JAILHOUSE_CELL_CREATE, create)
+ except IOError as e:
+ if e.errno != errno.EEXIST:
+ raise e
+
+ def load(self, image, address):
+ cbuf = ctypes.create_string_buffer(bytes(image))
+
+ load = struct.pack('i4x32sI4xQQQ8x',
+ JailhouseCell.JAILHOUSE_CELL_ID_UNUSED, self.name,
+ 1, ctypes.addressof(cbuf), len(image), address)
+ fcntl.ioctl(self.dev, self.JAILHOUSE_CELL_LOAD, load)
+
+ def start(self):
+ start = struct.pack('i4x32s', JailhouseCell.JAILHOUSE_CELL_ID_UNUSED,
+ self.name)
+ fcntl.ioctl(self.dev, JailhouseCell.JAILHOUSE_CELL_START, start)
diff --git a/python_module/setup.py b/python_module/setup.py
new file mode 100644
index 0000000..55f8e04
--- /dev/null
+++ b/python_module/setup.py
@@ -0,0 +1,15 @@
+
+# pyjailhouse, a python interface for the Jailhouse hypervisor
+#
+# Copyright (c) Christopher Goldsworthy, 2018
+#
+# This script is used to create project metadata when installing pyjailhouse
+# using pip.
+
+from setuptools import setup, find_packages
+
+setup(name="pyjailhouse", version="0.1",
+ description="A Python interface for the Jailhouse Hypervisor",
+ license="GPLv2", url="https://github.com/siemens/jailhouse",
+ author_email="jailho...@googlegroups.com",
+ packages=find_packages())
diff --git a/tools/jailhouse-cell-linux b/tools/jailhouse-cell-linux
index 913b5db..23a3ab5 100755
--- a/tools/jailhouse-cell-linux
+++ b/tools/jailhouse-cell-linux
@@ -12,14 +12,13 @@

from __future__ import print_function
import argparse
-import ctypes
-import errno
-import fcntl
import gzip
import os
import struct
import sys

+from pyjailhouse.cell import JailhouseCell
+
libexecdir = None


@@ -759,40 +758,6 @@ class X86ZeroPage:
return data + bytearray(0x1000 - len(data))


-class JailhouseCell:
- JAILHOUSE_CELL_CREATE = 0x40100002
- JAILHOUSE_CELL_LOAD = 0x40300003
- JAILHOUSE_CELL_START = 0x40280004
-
- JAILHOUSE_CELL_ID_UNUSED = -1
-
- def __init__(self, config):
- self.name = config.name.encode()
-
- self.dev = open('/dev/jailhouse')
-
- cbuf = ctypes.c_buffer(config.data)
- create = struct.pack('QI4x', ctypes.addressof(cbuf), len(config.data))
- try:
- fcntl.ioctl(self.dev, JailhouseCell.JAILHOUSE_CELL_CREATE, create)
- except IOError as e:
- if e.errno != errno.EEXIST:
- raise e
-
- def load(self, image, address):
- cbuf = ctypes.create_string_buffer(bytes(image))
-
- load = struct.pack('i4x32sI4xQQQ8x',
- JailhouseCell.JAILHOUSE_CELL_ID_UNUSED, self.name,
- 1, ctypes.addressof(cbuf), len(image), address)
- fcntl.ioctl(self.dev, self.JAILHOUSE_CELL_LOAD, load)
-
- def start(self):
- start = struct.pack('i4x32s', JailhouseCell.JAILHOUSE_CELL_ID_UNUSED,
- self.name)
- fcntl.ioctl(self.dev, JailhouseCell.JAILHOUSE_CELL_START, start)
-
-
def x86_gen_setup_data(config):
SETUP_TYPE_JAILHOUSE = 6
MAX_CPUS = 255
--
2.7.4

Christopher Goldsworthy

unread,
May 19, 2018, 8:56:47 AM5/19/18
to jailho...@googlegroups.com, Christopher Goldsworthy

byfl...@gmail.com

unread,
May 19, 2018, 8:58:41 AM5/19/18
to Jailhouse
Note - I realized I should've passed --thread to git format-patch, so I tried doing this and resending, but it seems that didn't work out. I'll format the patches properly next time.

Jan Kiszka

unread,
May 19, 2018, 10:52:06 AM5/19/18
to Christopher Goldsworthy, jailho...@googlegroups.com
On 2018-05-19 14:53, Christopher Goldsworthy wrote:
> Create a project folder jailhouse/python_module and related files, such that
> any python package placed in here is installable by pip
>
> Create a python package jailhouse/python_module/pyjailhouse, move JailhouseCell
> class used in jailhouse/tools/jailhouse-cell-linux into
> jailhouse/python_module/pyjailhouse/cell.py, import JailhouseCell from cell.py
> when in jailhouse-cell-linux

Thanks for moving on with this! Will try it out ASAP.

I would suggest a different structuring of the patches, though:

1. introduce module infrastructure, maybe just the module with
installation but without developer mode
2. add developer mode
3. move existing code into the pyjailhouse module

Jan
Reply all
Reply to author
Forward
0 new messages