On 2017-02-27 16:40, Henning Schild wrote:
> Make the "used, dirty" firmware image visible in sysfs. The data segment
> contains data that could be useful for all sorts of debugging tools.
> This feature is introduced to extract code coverage information (gcov).
>
> Signed-off-by: Henning Schild <[email protected]>
>
> diff --git a/driver/main.c b/driver/main.c
> --- a/driver/main.c
> +++ b/driver/main.c
> @@ -78,9 +78,10 @@
>
> DEFINE_MUTEX(jailhouse_lock);
> bool jailhouse_enabled;
> +void *hypervisor_mem;
> +size_t hypervisor_size;
hypervisor_size seems just like a duplication of bin_attr_firmware.size.
Do we really need it?
>
> static struct device *jailhouse_dev;
> -static void *hypervisor_mem;
> static unsigned long hv_core_and_percpu_size;
> static atomic_t call_done;
> static int error_code;
> @@ -277,8 +278,10 @@
> static void jailhouse_firmware_free(void)
> {
> if (hypervisor_mem) {
> + jailhouse_sysfs_firmware_exit(jailhouse_dev);
> vunmap(hypervisor_mem);
> hypervisor_mem = NULL;
> + hypervisor_size = 0;
This is overkill, you already NULLify the pointer.
> }
> }
>
> @@ -417,6 +420,11 @@
> header = (struct jailhouse_header *)hypervisor_mem;
> header->max_cpus = max_cpus;
>
> + hypervisor_size = hypervisor->size;
> + err = jailhouse_sysfs_firmware_init(jailhouse_dev);
jailhouse_sysfs_firmware_init should take the size as parameter.
> + if (err)
> + goto error_unmap;
> +
> /*
> * ARMv8 requires to clean D-cache and invalidate I-cache for memory
> * containing new instructions. On x86 this is a NOP. On ARMv7 the
> diff --git a/driver/main.h b/driver/main.h
> --- a/driver/main.h
> +++ b/driver/main.h
> @@ -19,6 +19,8 @@
>
> extern struct mutex jailhouse_lock;
> extern bool jailhouse_enabled;
> +extern void *hypervisor_mem;
> +extern size_t hypervisor_size;
>
> void *jailhouse_ioremap(phys_addr_t phys, unsigned long virt,
> unsigned long size);
> diff --git a/driver/sysfs.c b/driver/sysfs.c
> --- a/driver/sysfs.c
> +++ b/driver/sysfs.c
> @@ -379,6 +379,29 @@
> return info_show(dev, buffer, JAILHOUSE_INFO_REMAP_POOL_USED);
> }
>
> +static ssize_t firmware_show(struct file *filp, struct kobject *kobj,
> + struct bin_attribute *a, char *buf, loff_t off,
> + size_t count)
> +{
> + if (mutex_lock_interruptible(&jailhouse_lock) != 0)
> + return -EINTR;
> +
> + if (jailhouse_enabled ||
> + hypervisor_mem == NULL || hypervisor_size == 0) {
> + mutex_unlock(&jailhouse_lock);
> + return -EIO;
> + }
> + if (off >= hypervisor_size) {
> + count = 0;
> + } else {
> + if (off + count > hypervisor_size)
> + count = hypervisor_size - off;
> + memcpy(buf, hypervisor_mem + off, count);
> + }
> + mutex_unlock(&jailhouse_lock);
> + return count;
> +}
> +
> static DEVICE_ATTR_RO(console);
> static DEVICE_ATTR_RO(enabled);
> static DEVICE_ATTR_RO(mem_pool_size);
> @@ -401,6 +424,24 @@
> .attrs = jailhouse_sysfs_entries,
> };
>
> +static struct bin_attribute bin_attr_firmware = {
> + .attr.name = "jailhouse.bin",
jailhouse.bin is an ARM-only name. Let's name this more generically,
maybe "core" (like the "core" dump you get on crashes).
> + .attr.mode = S_IRUSR,
> + .size = 0,
> + .read = firmware_show
> +};
> +
> +int jailhouse_sysfs_firmware_init(struct device *dev)
> +{
> + bin_attr_firmware.size = hypervisor_size;
As mentioned before: hypervisor_size should come in as parameter.
> + return(sysfs_create_bin_file(&dev->kobj, &bin_attr_firmware));
> +}
> +
> +void jailhouse_sysfs_firmware_exit(struct device *dev)
> +{
> + sysfs_remove_bin_file(&dev->kobj, &bin_attr_firmware);
> +}
> +
> int jailhouse_sysfs_init(struct device *dev)
> {
> int err;
> diff --git a/driver/sysfs.h b/driver/sysfs.h
> --- a/driver/sysfs.h
> +++ b/driver/sysfs.h
> @@ -19,6 +19,8 @@
> void jailhouse_sysfs_cell_register(struct cell *cell);
> void jailhouse_sysfs_cell_delete(struct cell *cell);
>
> +int jailhouse_sysfs_firmware_init(struct device *dev);
> +void jailhouse_sysfs_firmware_exit(struct device *dev);
> int jailhouse_sysfs_init(struct device *dev);
> void jailhouse_sysfs_exit(struct device *dev);
>
>
Jan
--
Siemens AG, Corporate Technology, CT RDA ITP SES-DE
Corporate Competence Center Embedded Linux
--
You received this message because you are subscribed to the Google Groups
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.