Patches b03c1b through 3f00b5
authorStefan Kaestle <stefan.kaestle@inf.ethz.ch>
Wed, 20 Aug 2014 20:00:51 +0000 (22:00 +0200)
committerStefan Kaestle <stefan.kaestle@inf.ethz.ch>
Wed, 20 Aug 2014 20:00:51 +0000 (22:00 +0200)
22 files changed:
devices/virtio/virtio_blk.dev
devices/virtio/virtio_mmio.dev
devices/xeon_phi/xeon_phi_dma.dev
include/xeon_phi/xeon_phi_messaging.h [new file with mode: 0644]
tools/weever/boot.S
tools/weever/builder/Hakefile [moved from tools/weever/linux-host/Hakefile with 100% similarity]
tools/weever/builder/build_weever.c [moved from tools/weever/linux-host/build_weever.c with 100% similarity]
tools/weever/kernel_boot_param.h
tools/weever/kernel_boot_param/e820.h [deleted file]
tools/weever/kernel_boot_param/edd.h [deleted file]
tools/weever/kernel_boot_param/ist_bios.h [deleted file]
tools/weever/loader.c
usr/drivers/xeon_phi/Hakefile
usr/drivers/xeon_phi/boot.c
usr/drivers/xeon_phi/dma.h
usr/drivers/xeon_phi/main.c
usr/drivers/xeon_phi/messaging.c [new file with mode: 0644]
usr/drivers/xeon_phi/messaging.h [new file with mode: 0644]
usr/drivers/xeon_phi/service.c
usr/drivers/xeon_phi/service.h
usr/drivers/xeon_phi/xeon_phi.h
usr/skb/programs/device_db.pl

index 4baf42a..f451e7e 100644 (file)
@@ -27,10 +27,9 @@ device virtio_blk lsbfirst ( addr base ) "Virtio Block Device Specification" {
         _                   1 "Reserved";
         flush               1 "Cache flush command support (Legacy)";
         topology            1 "Device exports information on optimal IO alignment";
-        /* reserved bits */
-        _                  12 "";
+        _                  12 "Reserved";
         notify_on_empty     1 "(Legacy) The device MUST issue an interrupt if the device runs out of available descriptors"; 
-        _                   2 "";
+        _                   2 "Reserved";
         any_layout          1 "(Legacy) his feature indicates that the device accepts arbitrary descriptor layouts";
         ring_indirect_desc  1 "river can use descriptors with the VIRTQ_DESC_F_INDIRECT";
         ring_event_idx      1 "enables the used_event and the avail_event fields";
@@ -42,7 +41,7 @@ device virtio_blk lsbfirst ( addr base ) "Virtio Block Device Specification" {
      * Note: 
      */
     datatype req lsbfirst(32)  "Request header" {
-        rtype    32 "The type of the request";
+        rtype   32 "The type of the request";
         ioprio  32 "The IO prioroty (Legacy)";
         sector  64 "The sector where to write/read";
         /* data */
@@ -112,7 +111,7 @@ device virtio_blk lsbfirst ( addr base ) "Virtio Block Device Specification" {
    };
    
    register phys_block_exp addr(base, 0x18) "Toplogy: Logical Blocks" {
-       exp 8 "Number of logical blocks per physical block";
+      exp 8 "Number of logical blocks per physical block";
    };
    
    register align_offset addr(base, 0x19) "Topology: Align Offset" {
index cf54299..8e4cb95 100644 (file)
@@ -36,7 +36,7 @@ device virtio_mmio lsbfirst ( addr base ) "Virtio MMIO Transport Specification"
     };
     
     constants virtio_deviceid width(32) "Virtio Device IDs" {
-        reserved         = 0x0 "Invalid Device ID";
+        reserved        = 0x0 "Invalid Device ID";
         network_card    = 0x1 "Network Interface Device";
         block_device    = 0x2 "Block Device";
         console         = 0x3 "Serial Console Device";
index be9907b..c9c7077 100644 (file)
@@ -73,20 +73,15 @@ device xeon_phi_dma lsbfirst ( addr base ) "Intel Xeon Phi DMA System" {
      * Register Access: CRU
      * Number: 8
      */
-       regarray drar_lo rw addr(base, 0xA014) [0x0, 0x40, 0x80, 0xC0, 0x100, 0x140, 0x180, 0x1C0] "DMA Descriptor Ring Attributes Register Lo" {
-        r 32 "";
+    regarray drar rw addr(base, 0xA014) [0x0, 0x40, 0x80, 0xC0, 0x100, 0x140, 0x180, 0x1C0] "DMA Descriptor Ring Attributes Register Lo" {
+        _     6 "";
+        base 30 "base address";
+        _     2 "";
+        size 15 "size of the descriptor ring";
+        page  5 "";
+        _     6 "";            
     };
        
-       /*
-     * Protection Level: Ring 0
-     * Visibility: Host / Coprocessor
-     * Reset Dmain: GRPB_REset
-     * Register Access: CRU
-     * Number: 8
-     */
-       regarray drar_hi rw addr(base, 0xA018) [0x0, 0x40, 0x80, 0xC0, 0x100, 0x140, 0x180, 0x1C0] "DMA Descriptor Ring Attributes Register Hi" {
-        r 32 "";
-    };
        
        /*
      * Protection Level: Ring 0
diff --git a/include/xeon_phi/xeon_phi_messaging.h b/include/xeon_phi/xeon_phi_messaging.h
new file mode 100644 (file)
index 0000000..2ba7f2a
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2014 ETH Zurich.
+ * All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+#ifndef XEON_PHI_MESSAGING_H_
+#define XEON_PHI_MESSAGING_H_
+
+///
+#define XEON_PHI_MSG_SIZE
+
+#define XEON_PHI_MSG_CHAN 63
+
+enum {
+  XEON_PHI_CHAN_TYPE_VIRTIO,
+  XEON_PHI_CHAN_TYPE_UMP,
+  XEON_PHI_CHAN_TYPE_OTHER
+};
+
+enum {
+  XEON_PHI_CHAN_OWNER_SELF,
+  XEON_PHI_CHAN_OWNER_OTHER
+};
+
+enum {
+
+};
+
+struct xeon_phi_msg_chan {
+    lpaddr_t base;
+    lvaddr_t vbase;
+    uint64_t size;
+    uint64_t _pad[5];
+};
+
+struct xeon_phi_msg_meta {
+    uint8_t meta_changed;
+    uint8_t chan_changed[XEON_PHI_MSG_CHAN];
+    struct xeon_phi_msg_chan chan[XEON_PHI_MSG_CHAN];
+};
+
+
+
+#endif // XEON_PHI_MESSAGING_H_
index d657d6f..9a446ad 100644 (file)
@@ -222,7 +222,7 @@ ENTRY(startup_64)
            /* jump to the kernel entry point */
           movq      $K1OM_BOOT_MAGIC, %rax
           movq      multiboot_info, %rbx
-          movq kernel_entry, %rcx
+          movq      kernel_entry, %rcx
           jmp       *%rcx
 
           .data
index ee4d6a4..7afda4f 100644 (file)
 #ifndef KERNEL_BOOT_PARAM_H
 #define KERNEL_BOOT_PARAM_H
 
-#include "kernel_boot_param/screen_info.h"
-#include "kernel_boot_param/apm_bios.h"
-#include "kernel_boot_param/ist_bios.h"
-#include "kernel_boot_param/edd.h"
-#include "kernel_boot_param/e820.h"
 
 struct edid_info
 {
@@ -48,9 +43,9 @@ struct setup_data
 
 struct setup_header
 {
-    uint8_t setup_sects;
+    uint8_t setup_sects;    /// must be kept
     uint16_t root_flags;
-    uint32_t syssize;
+    uint32_t syssize;       /// must be kept
     uint16_t ram_size;
 #define RAMDISK_IMAGE_START_MASK       0x07FF
 #define RAMDISK_PROMPT_FLAG            0x8000
@@ -59,7 +54,7 @@ struct setup_header
     uint16_t root_dev;
     uint16_t boot_flag;
     uint16_t jump;
-    uint32_t header;
+    uint32_t header;        /// header stirng
     uint16_t version;
     uint32_t realmode_swtch;
     uint16_t start_sys;
@@ -72,23 +67,24 @@ struct setup_header
 #define CAN_USE_HEAP   (1<<7)
     uint16_t setup_move_size;
     uint32_t code32_start;
-    uint32_t ramdisk_image;
-    uint32_t ramdisk_size;
+    uint32_t ramdisk_image; /// pointer to the multiboot image
+    uint32_t ramdisk_size;  /// multiboot image size
     uint32_t bootsect_kludge;
     uint16_t heap_end_ptr;
     uint8_t ext_loader_ver;
     uint8_t ext_loader_type;
-    uint32_t cmd_line_ptr;
+    uint32_t cmd_line_ptr;  /// pointer to the command line
     uint32_t initrd_addr_max;
     uint32_t kernel_alignment;
     uint8_t relocatable_kernel;
     uint8_t _pad2[3];
-    uint32_t cmdline_size;
+    uint32_t cmdline_size;  /// size of the command line
     uint32_t hardware_subarch;
     uint64_t hardware_subarch_data;
     uint32_t payload_offset;
     uint32_t payload_length;
     uint64_t setup_data;
+    uint64_t multiboot;     /// pointer to the multiboot information
 }__attribute__((packed));
 
 struct sys_desc_table
@@ -118,37 +114,28 @@ struct efi_info
     uint32_t efi_memmap_hi;
 };
 
+struct ist_info {
+    uint32_t signature;
+    uint32_t command;
+    uint32_t event;
+    uint32_t perf_level;
+};
+
 /* The so-called "zeropage" */
 struct boot_params
 {
-    struct screen_info screen_info; /* 0x000 */
-    struct apm_bios_info apm_bios_info; /* 0x040 */
-    uint8_t _pad2[4]; /* 0x054 */
+    uint8_t reserved[0x54];
     uint64_t tboot_addr; /* 0x058 */
-    struct ist_info ist_info; /* 0x060 */
-    uint8_t _pad3[16]; /* 0x070 */
-    uint8_t hd0_info[16]; /* obsolete! *//* 0x080 */
-    uint8_t hd1_info[16]; /* obsolete! *//* 0x090 */
-    struct sys_desc_table sys_desc_table; /* 0x0a0 */
-    struct olpc_ofw_header olpc_ofw_header; /* 0x0b0 */
-    uint8_t _pad4[128]; /* 0x0c0 */
-    struct edid_info edid_info; /* 0x140 */
-    struct efi_info efi_info; /* 0x1c0 */
-    uint32_t alt_mem_k; /* 0x1e0 */
+    uint8_t _pad3[128]; /* 0x070 */
+    uint8_t dummy[256];
+    uint8_t _pad1[4];
     uint32_t scratch; /* Scratch field! *//* 0x1e4 */
-    uint8_t e820_entries; /* 0x1e8 */
-    uint8_t eddbuf_entries; /* 0x1e9 */
-    uint8_t edd_mbr_sig_buf_entries; /* 0x1ea */
-    uint8_t _pad6[6]; /* 0x1eb */
+    uint8_t _pad6[13]; /* 0x1eb */
     struct setup_header hdr; /* setup header *//* 0x1f1 */
-    uint8_t _pad7[0x290 - 0x1f1 - sizeof(struct setup_header)];
-    uint32_t edd_mbr_sig_buffer[EDD_MBR_SIG_MAX]; /* 0x290 */
-    struct e820entry e820_map[E820MAX]; /* 0x2d0 */
-    uint8_t _pad8[48]; /* 0xcd0 */
-    struct edd_info eddbuf[EDDMAXNR]; /* 0xd00 */
-    uint8_t _pad9[276]; /* 0xeec */
 }__attribute__((packed));
 
+
+
 enum
 {
     X86_SUBARCH_PC = 0,
diff --git a/tools/weever/kernel_boot_param/e820.h b/tools/weever/kernel_boot_param/e820.h
deleted file mode 100644 (file)
index 4f14195..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * \file
- * \brief Struct definition for the boot param struct supplied by the
- *        K1OM boot loader
- */
-
-/*
- * Copyright (c) 2013 ETH Zurich.
- * All rights reserved.
- *
- * This file is distributed under the terms in the attached LICENSE file.
- * If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
- *
- * This is adapted from the Linux kernel (kernel.org)
- *
- */
-
-#ifndef KERNEL_E820_H
-#define KERNEL_E820_H
-
-
-#define E820MAP 0x2d0       /* our map */
-#define E820MAX 128     /* number of entries in E820MAP */
-
-/*
- * Legacy E820 BIOS limits us to 128 (E820MAX) nodes due to the
- * constrained space in the zeropage.  If we have more nodes than
- * that, and if we've booted off EFI firmware, then the EFI tables
- * passed us from the EFI firmware can list more nodes.  Size our
- * internal memory map tables to have room for these additional
- * nodes, based on up to three entries per node for which the
- * kernel was built: MAX_NUMNODES == (1 << CONFIG_NODES_SHIFT),
- * plus E820MAX, allowing space for the possible duplicate E820
- * entries that might need room in the same arrays, prior to the
- * call to sanitize_e820_map() to remove duplicates.  The allowance
- * of three memory map entries per node is "enough" entries for
- * the initial hardware platform motivating this mechanism to make
- * use of additional EFI map entries.  Future platforms may want
- * to allow more than three entries per node or otherwise refine
- * this size.
- */
-
-/*
- * Odd: 'make headers_check' complains about numa.h if I try
- * to collapse the next two #ifdef lines to a single line:
- *  #if defined(__KERNEL__) && defined(CONFIG_EFI)
- */
-#define E820_X_MAX E820MAX
-
-#define E820NR  0x1e8       /* # entries in E820MAP */
-
-#define E820_RAM    1
-#define E820_RESERVED   2
-#define E820_ACPI   3
-#define E820_NVS    4
-#define E820_UNUSABLE   5
-
-
-/*
- * reserved RAM used by kernel itself
- * if CONFIG_INTEL_TXT is enabled, memory of this type will be
- * included in the S3 integrity calculation and so should not include
- * any memory that BIOS might alter over the S3 transition
- */
-#define E820_RESERVED_KERN        128
-
-#ifndef __ASSEMBLY__
-struct e820entry {
-    uint64_t addr; /* start of memory segment */
-    uint64_t size; /* size of memory segment */
-    uint32_t type; /* type of memory segment */
-} __attribute__((packed));
-
-struct e820map {
-    uint32_t nr_map;
-    struct e820entry map[E820_X_MAX];
-};
-
-#define ISA_START_ADDRESS   0xa0000
-#define ISA_END_ADDRESS     0x100000
-
-#define BIOS_BEGIN      0x000a0000
-#define BIOS_END        0x00100000
-
-#define BIOS_ROM_BASE       0xffe00000
-#define BIOS_ROM_END        0xffffffff
-
-#endif /* __ASSEMBLY__ */
-
-
-#endif /* KERNEL_E820_H */
-
diff --git a/tools/weever/kernel_boot_param/edd.h b/tools/weever/kernel_boot_param/edd.h
deleted file mode 100644 (file)
index 2a7e1b1..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-/**
- * \file
- * \brief Struct definition for the boot param struct supplied by the
- *        K1OM boot loader
- */
-
-/*
- * Copyright (c) 2013 ETH Zurich.
- * All rights reserved.
- *
- * This file is distributed under the terms in the attached LICENSE file.
- * If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
- *
- * This is adapted from the Linux kernel (kernel.org)
- *
- */
-
-/*
- * linux/include/linux/edd.h
- *  Copyright (C) 2002, 2003, 2004 Dell Inc.
- *  by Matt Domsch <Matt_Domsch@dell.com>
- *
- * structures and definitions for the int 13h, ax={41,48}h
- * BIOS Enhanced Disk Drive Services
- * This is based on the T13 group document D1572 Revision 0 (August 14 2002)
- * available at http://www.t13.org/docs2002/d1572r0.pdf.  It is
- * very similar to D1484 Revision 3 http://www.t13.org/docs2002/d1484r3.pdf
- *
- * In a nutshell, arch/{i386,x86_64}/boot/setup.S populates a scratch
- * table in the boot_params that contains a list of BIOS-enumerated
- * boot devices.
- * In arch/{i386,x86_64}/kernel/setup.c, this information is
- * transferred into the edd structure, and in drivers/firmware/edd.c, that
- * information is used to identify BIOS boot disk.  The code in setup.S
- * is very sensitive to the size of these structures.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License v2.0 as published by
- * the Free Software Foundation
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- */
-#ifndef KERNEL_EDD_H
-#define KERNEL_EDD_H
-
-
-#define EDDNR 0x1e9     /* addr of number of edd_info structs at EDDBUF
-                   in boot_params - treat this as 1 byte  */
-#define EDDBUF  0xd00       /* addr of edd_info structs in boot_params */
-#define EDDMAXNR 6      /* number of edd_info structs starting at EDDBUF  */
-#define EDDEXTSIZE 8        /* change these if you muck with the structures */
-#define EDDPARMSIZE 74
-#define CHECKEXTENSIONSPRESENT 0x41
-#define GETDEVICEPARAMETERS 0x48
-#define LEGACYGETDEVICEPARAMETERS 0x08
-#define EDDMAGIC1 0x55AA
-#define EDDMAGIC2 0xAA55
-
-
-#define READ_SECTORS 0x02         /* int13 AH=0x02 is READ_SECTORS command */
-#define EDD_MBR_SIG_OFFSET 0x1B8  /* offset of signature in the MBR */
-#define EDD_MBR_SIG_BUF    0x290  /* addr in boot params */
-#define EDD_MBR_SIG_MAX 16        /* max number of signatures to store */
-#define EDD_MBR_SIG_NR_BUF 0x1ea  /* addr of number of MBR signtaures at EDD_MBR_SIG_BUF
-                     in boot_params - treat this as 1 byte  */
-
-#ifndef __ASSEMBLY__
-
-#define EDD_EXT_FIXED_DISK_ACCESS           (1 << 0)
-#define EDD_EXT_DEVICE_LOCKING_AND_EJECTING (1 << 1)
-#define EDD_EXT_ENHANCED_DISK_DRIVE_SUPPORT (1 << 2)
-#define EDD_EXT_64BIT_EXTENSIONS            (1 << 3)
-
-#define EDD_INFO_DMA_BOUNDARY_ERROR_TRANSPARENT (1 << 0)
-#define EDD_INFO_GEOMETRY_VALID                (1 << 1)
-#define EDD_INFO_REMOVABLE                     (1 << 2)
-#define EDD_INFO_WRITE_VERIFY                  (1 << 3)
-#define EDD_INFO_MEDIA_CHANGE_NOTIFICATION     (1 << 4)
-#define EDD_INFO_LOCKABLE                      (1 << 5)
-#define EDD_INFO_NO_MEDIA_PRESENT              (1 << 6)
-#define EDD_INFO_USE_INT13_FN50                (1 << 7)
-
-struct edd_device_params {
-    uint16_t length;
-    uint16_t info_flags;
-    uint32_t num_default_cylinders;
-    uint32_t num_default_heads;
-    uint32_t sectors_per_track;
-    uint64_t number_of_sectors;
-    uint16_t bytes_per_sector;
-    uint32_t dpte_ptr;     /* 0xFFFFFFFF for our purposes */
-    uint16_t key;      /* = 0xBEDD */
-    uint8_t device_path_info_length;   /* = 44 */
-    uint8_t reserved2;
-    uint16_t reserved3;
-    uint8_t host_bus_type[4];
-    uint8_t interface_type[8];
-    union {
-        struct {
-            uint16_t base_address;
-            uint16_t reserved1;
-            uint32_t reserved2;
-        } __attribute__ ((packed)) isa;
-        struct {
-            uint8_t bus;
-            uint8_t slot;
-            uint8_t function;
-            uint8_t channel;
-            uint32_t reserved;
-        } __attribute__ ((packed)) pci;
-        /* pcix is same as pci */
-        struct {
-            uint64_t reserved;
-        } __attribute__ ((packed)) ibnd;
-        struct {
-            uint64_t reserved;
-        } __attribute__ ((packed)) xprs;
-        struct {
-            uint64_t reserved;
-        } __attribute__ ((packed)) htpt;
-        struct {
-            uint64_t reserved;
-        } __attribute__ ((packed)) unknown;
-    } interface_path;
-    union {
-        struct {
-            uint8_t device;
-            uint8_t reserved1;
-            uint16_t reserved2;
-            uint32_t reserved3;
-            uint64_t reserved4;
-        } __attribute__ ((packed)) ata;
-        struct {
-            uint8_t device;
-            uint8_t lun;
-            uint8_t reserved1;
-            uint8_t reserved2;
-            uint32_t reserved3;
-            uint64_t reserved4;
-        } __attribute__ ((packed)) atapi;
-        struct {
-            uint16_t id;
-            uint64_t lun;
-            uint16_t reserved1;
-            uint32_t reserved2;
-        } __attribute__ ((packed)) scsi;
-        struct {
-            uint64_t serial_number;
-            uint64_t reserved;
-        } __attribute__ ((packed)) usb;
-        struct {
-            uint64_t eui;
-            uint64_t reserved;
-        } __attribute__ ((packed)) i1394;
-        struct {
-            uint64_t wwid;
-            uint64_t lun;
-        } __attribute__ ((packed)) fibre;
-        struct {
-            uint64_t identity_tag;
-            uint64_t reserved;
-        } __attribute__ ((packed)) i2o;
-        struct {
-            uint32_t array_number;
-            uint32_t reserved1;
-            uint64_t reserved2;
-        } __attribute__ ((packed)) raid;
-        struct {
-            uint8_t device;
-            uint8_t reserved1;
-            uint16_t reserved2;
-            uint32_t reserved3;
-            uint64_t reserved4;
-        } __attribute__ ((packed)) sata;
-        struct {
-            uint64_t reserved1;
-            uint64_t reserved2;
-        } __attribute__ ((packed)) unknown;
-    } device_path;
-    uint8_t reserved4;
-    uint8_t checksum;
-} __attribute__ ((packed));
-
-struct edd_info {
-    uint8_t device;
-    uint8_t version;
-    uint16_t interface_support;
-    uint16_t legacy_max_cylinder;
-    uint8_t legacy_max_head;
-    uint8_t legacy_sectors_per_track;
-    struct edd_device_params params;
-} __attribute__ ((packed));
-
-struct edd {
-    unsigned int mbr_signature[EDD_MBR_SIG_MAX];
-    struct edd_info edd_info[EDDMAXNR];
-    unsigned char mbr_signature_nr;
-    unsigned char edd_info_nr;
-};
-
-#endif              /*!__ASSEMBLY__ */
-
-#endif /* KERNEL_EDD_H */
-
diff --git a/tools/weever/kernel_boot_param/ist_bios.h b/tools/weever/kernel_boot_param/ist_bios.h
deleted file mode 100644 (file)
index 88dd240..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * \file
- * \brief Struct definition for the boot param struct supplied by the
- *        K1OM boot loader
- */
-
-/*
- * Copyright (c) 2013 ETH Zurich.
- * All rights reserved.
- *
- * This file is distributed under the terms in the attached LICENSE file.
- * If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
- *
- * This is adapted from the Linux kernel (kernel.org)
- *
- */
-
-#ifndef KERNEL_IST_BIOS_H
-#define KERNEL_IST_BIOS_H
-
-struct ist_info {
-    uint32_t signature;
-    uint32_t command;
-    uint32_t event;
-    uint32_t perf_level;
-};
-
-#endif /* KERNEL_IST_BIOS_H */
index a8f64d2..ffc85a2 100644 (file)
@@ -207,7 +207,7 @@ loader(uint64_t magic,
     lpaddr_t mb_img_orig = boot_hdr->ramdisk_image;
 
     /* sanity check for the locations */
-    if (mb_img_start > mb_img_orig) {
+    if (mb_img_start > mb_img_orig || mb_img_start == 0) {
         eabort('E', '1');
     }
     memcpy((void *) mb_img_start, (void *) mb_img_orig, boot_hdr->ramdisk_size);
@@ -257,6 +257,8 @@ loader(uint64_t magic,
     multiboot_info->config_table = (uint32_t)(uintptr_t)bootparam;
     multiboot_info->flags |= MULTIBOOT_INFO_FLAG_HAS_CONFIG;
 
+    boot_hdr->multiboot = (uint64_t)multiboot_info;
+
     print_status('S', '3');
 
     err = elf64_load(EM_K1OM, linear_alloc, NULL, kernel->mod_start,
index 6f4d5b5..9be30e0 100644 (file)
@@ -19,7 +19,8 @@
                                  "dma.c", 
                                  "interrupts.c", 
                                  "service.c", 
-                                 "smpt.c", 
+                                 "smpt.c",
+                                 "messaging.c", 
                                  "sleep.c" ],
                       addLibraries = libDeps ["skb", 
                                               "pci", 
index bb3d9a9..72515ae 100644 (file)
@@ -26,6 +26,7 @@
 struct bootinfo *bi = NULL;
 
 #include "xeon_phi.h"
+#include "messaging.h"
 #include "sleep.h"
 
 #define BOOT_TIMEOUT 3000
@@ -45,7 +46,6 @@ struct bootinfo *bi = NULL;
 #define MIN(a, b)   ( ((a) < (b)) ? (a) : (b) )
 #define ALIGN(x) ((x + BASE_PAGE_SIZE-1) & ~(BASE_PAGE_SIZE-1))
 
-
 static xeon_phi_boot_t boot_registers;
 static xeon_phi_apic_t apic_registers;
 
@@ -57,10 +57,9 @@ static xeon_phi_apic_t apic_registers;
  */
 static inline lvaddr_t get_load_offset(struct xeon_phi *phi)
 {
-    return ((lvaddr_t)xeon_phi_boot_download_offset_rdf(&boot_registers))<<12;
+    return ((lvaddr_t) xeon_phi_boot_download_offset_rdf(&boot_registers)) << 12;
 }
 
-
 static uint64_t get_adapter_memsize(void)
 {
     xeon_phi_boot_meminfo_t meminfo = xeon_phi_boot_meminfo_rd(&boot_registers);
@@ -89,16 +88,13 @@ static uint64_t get_adapter_memsize(void)
  * \param phi           the xeon phi card information
  * \param xloader_img   name of the bootloader image
  * \param ret_imgsize   returned image size
- * \param ret_cmdoffset returned offset to load the next piece onto the card
  *
  * Note: it is important that the bootloader just uses statically allocated
  *       memory and does not exceed its image size with additional memory.
  *       Otherwise the CMD line or the multiboot image will be overwritten.
  */
 static errval_t load_bootloader(struct xeon_phi *phi,
-                                char *xloader_img,
-                                uint32_t *ret_imgsize,
-                                lvaddr_t *ret_loadoffset)
+                                char *xloader_img)
 {
     errval_t err;
     /*
@@ -128,23 +124,12 @@ static errval_t load_bootloader(struct xeon_phi *phi,
 
     phi->apicid = xeon_phi_boot_download_apicid_rdf(&boot_registers);
 
-    XBOOT_DEBUG("bootloader offset = 0x%lx\n", phi->apt.vbase + loadoffset);
-
-    printf("Loading xloader onto card...\n");
-    XBOOT_DEBUG("aper_base=0x%lx, offset = 0x%lx, size=0x%lx\n",
-                phi->apt.vbase,
-                loadoffset,
-                imgsize);
+    XBOOT_DEBUG("Loading xloader onto card... offset = 0x%lx\n", loadoffset);
 
     memcpy((void *) (phi->apt.vbase + loadoffset), (void *) binary, imgsize);
 
-    if (ret_loadoffset) {
-        *ret_loadoffset = loadoffset;
-    }
-
-    if (ret_imgsize) {
-        *ret_imgsize = imgsize;
-    }
+    phi->os_offset = loadoffset;
+    phi->os_size = imgsize;
 
     return SYS_ERR_OK;
 }
@@ -154,13 +139,11 @@ static errval_t load_bootloader(struct xeon_phi *phi,
  */
 static errval_t load_multiboot_image(struct xeon_phi *phi,
                                      char *multiboot_img,
-                                     lvaddr_t load_offset,
-                                     uint32_t os_offset)
+                                     lvaddr_t load_offset)
 {
     errval_t err;
 
-    XBOOT_DEBUG("multiboot offset = 0x%lx\n", phi->apt.vbase + load_offset);
-
+    assert(phi->os_offset != 0);
     /*
      * find the boot loader image in the host multiboot
      */
@@ -179,11 +162,8 @@ static errval_t load_multiboot_image(struct xeon_phi *phi,
 
     imgsize = module->mrmod_size;
 
-    printf("Loading multiboot image onto card...\n");
-    XBOOT_DEBUG("aper_base=0x%lx, offset = 0x%lx, size=0x%lx\n",
-                phi->apt.vbase,
-                load_offset,
-                imgsize);
+    XBOOT_DEBUG("loading multiboot image onto card... offset = 0x%lx\n",
+                load_offset);
 
     memcpy((void *) (phi->apt.vbase + load_offset), (void *) image, imgsize);
 
@@ -191,10 +171,10 @@ static errval_t load_multiboot_image(struct xeon_phi *phi,
      * we are using the Linux style way in booting. The following will update
      * the corresponding fields in struct boot_param of the header.
      */
-    uint32_t *ramfs_addr_ptr = (uint32_t *) (phi->apt.vbase + os_offset + 0x218);
-    *ramfs_addr_ptr = load_offset;
-    ramfs_addr_ptr = (uint32_t *) (phi->apt.vbase + os_offset + 0x21c);
-    *ramfs_addr_ptr = imgsize;
+    uint32_t *ramfs_addr_ptr = (uint32_t *) (phi->apt.vbase + phi->os_offset + 0x218);
+    *ramfs_addr_ptr = (uint32_t)load_offset;
+    ramfs_addr_ptr = (uint32_t *) (phi->apt.vbase + phi->os_offset + 0x21c);
+    *ramfs_addr_ptr = (uint32_t)imgsize;
 
     return SYS_ERR_OK;
 }
@@ -207,22 +187,26 @@ static errval_t load_multiboot_image(struct xeon_phi *phi,
  * \param   ret_size    size of the cmdline in bytes
  */
 static errval_t load_cmdline(struct xeon_phi *phi,
-                             lvaddr_t load_offset,
-                             uint32_t *ret_size)
+                             lvaddr_t load_offset)
 {
     uint32_t cmdlen = 0;
 
-    XBOOT_DEBUG("cmdline offset = 0x%lx\n", phi->apt.vbase + load_offset);
+    XBOOT_DEBUG("copying cmdline onto card, offset = 0x%lx\n", load_offset);
 
     void *buf = (void *) (phi->apt.vbase + load_offset);
 
+    if (phi->msg) {
+        cmdlen += sprintf(buf + cmdlen,
+                          "msg_base=%lx, msg_size=%lx",
+                          phi->msg->base,
+                          phi->msg->size);
+    }
+
     if (phi->cmdline) {
-        cmdlen += sprintf(buf+cmdlen, "%s foobar=%i", phi->cmdline, 123);
-    } else {
-        cmdlen += sprintf(buf+cmdlen, "foobar=%i", 123);
+        cmdlen += sprintf(buf + cmdlen, "%s", phi->cmdline);
     }
 
-    cmdlen += sprintf(buf+cmdlen, "card_id=%i", phi->id);
+    cmdlen += sprintf(buf + cmdlen, "card_id=%i", phi->id);
 
     /*
      * id
@@ -231,34 +215,33 @@ static errval_t load_cmdline(struct xeon_phi *phi,
      * TODO: Add multihop / communication information here..
      */
 
-    if (ret_size) {
-        *ret_size = cmdlen;
-    }
+
+    phi->cmdline = buf;
+    phi->cmdlen = cmdlen;
+
+    uint32_t *cmdline_ptr = (uint32_t *) (phi->apt.vbase + phi->os_offset + 0x228);
+    *cmdline_ptr = (uint32_t)((uint64_t)phi->cmdline);
 
     return SYS_ERR_OK;
 }
 
-static errval_t bootstrap_notify(struct xeon_phi *phi,
-                                 uint32_t os_imgsize)
+static errval_t bootstrap_notify(struct xeon_phi *phi)
 {
     // set the bootimage size to tell the bootloader
-    xeon_phi_boot_os_size_rawwr(&boot_registers, os_imgsize);
+    xeon_phi_boot_os_size_rawwr(&boot_registers, phi->os_size);
 
     uint64_t memsize = get_adapter_memsize();
 
     uint64_t reserved = (memsize * MEMORY_RESERVE_PERCENT / 100);
 
-
     // Keep in mind maximum uos reserve size is uint32_t, so we never overflow
     reserved = MIN(reserved, UOS_RESERVE_SIZE_MAX);
     reserved = MAX(reserved, UOS_RESERVE_SIZE_MIN);
 
     // Always align uos reserve size to a page
-    reserved = (reserved & ~(BASE_PAGE_SIZE-1));
+    reserved = (reserved & ~(BASE_PAGE_SIZE - 1));
 
-    XBOOT_DEBUG("memsize = 0x%lx, reserved size = 0x%lx\n", memsize, reserved);
-
-    xeon_phi_boot_res_size_rawwr(&boot_registers, (uint32_t)reserved);
+    xeon_phi_boot_res_size_rawwr(&boot_registers, (uint32_t) reserved);
 
     // sending the bootstrap interrupt
     xeon_phi_apic_icr_lo_t icr_lo = xeon_phi_apic_icr_lo_default;
@@ -286,8 +269,7 @@ errval_t xeon_phi_boot(struct xeon_phi *phi,
                        char *multiboot_img)
 {
     errval_t err;
-    lvaddr_t offset, os_offset;
-    uint32_t size, osimg_size;
+    lvaddr_t offset;
 
     if (bi == NULL) {
         return SYS_ERR_ILLEGAL_INVOCATION;
@@ -298,32 +280,33 @@ errval_t xeon_phi_boot(struct xeon_phi *phi,
                              XEON_PHI_MMIO_TO_DBOX(phi));
     xeon_phi_apic_initialize(&apic_registers, XEON_PHI_MMIO_TO_SBOX(phi));
 
-
     phi->apicid = xeon_phi_boot_download_apicid_rdf(&boot_registers);
-    XBOOT_DEBUG("APICID = %u\n", phi->apicid);
 
     // load the coprocessor OS
-    err = load_bootloader(phi, xloader_img, &osimg_size, &offset);
+    err = load_bootloader(phi, xloader_img);
     if (err_is_fail(err)) {
         USER_PANIC_ERR(err, "Could not load bootloader image");
     }
 
-    os_offset = offset;
-
     // round to next page
-    offset = ALIGN(osimg_size + offset);
+    offset = ALIGN(phi->os_offset + phi->os_size);
+
+    err = messaging_init(phi);
+    if (err_is_fail(err)) {
+        USER_PANIC_ERR(err, "Could not initialize messagin");
+    }
 
     // load cmdline
-    err = load_cmdline(phi, offset, &size);
+    err = load_cmdline(phi, offset);
     if (err_is_fail(err)) {
         USER_PANIC_ERR(err, "Could not load multiboot image");
     }
 
     // round to next page
-    offset = ALIGN(offset);
+    offset = ALIGN(offset+phi->cmdlen);
 
     // load multiboot image
-    err = load_multiboot_image(phi, multiboot_img, offset, os_offset);
+    err = load_multiboot_image(phi, multiboot_img, offset);
     if (err_is_fail(err)) {
         USER_PANIC_ERR(err, "Could not load multiboot image");
     }
@@ -335,16 +318,17 @@ errval_t xeon_phi_boot(struct xeon_phi *phi,
     xeon_phi_serial_init(phi);
 
     // notify the bootstrap
-    bootstrap_notify(phi, osimg_size);
+    bootstrap_notify(phi);
 
     xeon_phi_boot_postcode_t postcode;
     xeon_phi_boot_postcodes_t pc, pc_prev = 0;
     uint32_t counter = BOOT_COUNTER;
-    while(--counter) {
+    while (--counter) {
         postcode = xeon_phi_boot_postcode_rd(&boot_registers);
         pc = xeon_phi_boot_postcode_code_extract(postcode);
         if (pc_prev != pc) {
-            debug_printf("Xeon Phi Booting: %s\n", xeon_phi_boot_postcodes_describe(pc));
+            debug_printf("Xeon Phi Booting: %s\n",
+                         xeon_phi_boot_postcodes_describe(pc));
         }
         if (postcode == xeon_phi_boot_postcode_done) {
             break;
@@ -355,15 +339,17 @@ errval_t xeon_phi_boot(struct xeon_phi *phi,
     XBOOT_DEBUG("Bootstrap has finished execution. Waiting for Firmware...\n");
 
     uint32_t time = 0, time_steps = 0;
-    while(time < BOOT_TIMEOUT) {
+    while (time < BOOT_TIMEOUT) {
         /* read all the pending messages */
         xeon_phi_serial_handle_recv();
         milli_sleep(100);
         if (xeon_phi_boot_download_status_rdf(&boot_registers)) {
+            XBOOT_DEBUG("Firmware signaled with ready bit. \n");
             break;
         }
         if (time % 50) {
-            debug_printf("Xeon Phi Booting: Waiting for ready signal %u\n", time_steps);
+            debug_printf("Xeon Phi Booting: Waiting for ready signal %u\n",
+                         time_steps);
             time_steps += 5;
         }
     }
index 6e2030d..a432753 100644 (file)
 //#include <dev/xeon_phi/xeon_phi_dma_dev.h>
 
 
-struct dma_info {
-
-};
+#define XEON_PHI_DMA_CHAN_NUM 8
 
 struct dma_channel {
 
 
 };
 
+struct dma_info {
+    struct dma_channel chan[XEON_PHI_DMA_CHAN_NUM];
+};
+
 errval_t dma_request_alloc(void);
 
 errval_t dma_request_exec(void);
index 6e0618d..16ec8f8 100644 (file)
@@ -69,7 +69,7 @@ int main(int argc,
         DEBUG_ERR(err, "could not register with the other drivers");
     }
 
-    service_start();
+    service_start(&xphi);
 
     debug_printf("Xeon Phi host module terminated.\n");
 
diff --git a/usr/drivers/xeon_phi/messaging.c b/usr/drivers/xeon_phi/messaging.c
new file mode 100644 (file)
index 0000000..6bd331f
--- /dev/null
@@ -0,0 +1,112 @@
+/**
+ * \file
+ * \brief Boot module for the Xeon Phi
+ *
+ * Loads the co processor OS onto the card and boots it
+ */
+
+/*
+ * Copyright (c) 2014 ETH Zurich.
+ * All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <barrelfish/barrelfish.h>
+
+#include "xeon_phi.h"
+#include "messaging.h"
+
+
+/**
+ * \brief initializes the messaging boostrap infrastructure between the
+ *        host and the card
+ *
+ * \param phi the xeon phi to initialize the basic messaging bootstrap
+ *
+ * \return SYS_ERR_OK on success
+ */
+errval_t messaging_init(struct xeon_phi *phi)
+{
+    errval_t err;
+
+    assert(phi->msg == NULL);
+
+    struct msg_info *mi = malloc(sizeof(struct msg_info));
+    if (mi == NULL) {
+        return LIB_ERR_MALLOC_FAIL;
+    }
+
+
+    err = frame_alloc(&mi->frame, 4096, &mi->size);
+    if (err_is_fail(err)) {
+        return err;
+    }
+
+    struct frame_identity id;
+    err = invoke_frame_identify(mi->frame, &id);
+    if (err_is_fail(err)) {
+        cap_destroy(mi->frame);
+        free(mi);
+        return err;
+    }
+
+    mi->base = id.base;
+
+    err = vspace_map_one_frame(&mi->addr, mi->size, mi->frame, NULL, NULL);
+    if (err_is_fail(err)) {
+        cap_destroy(mi->frame);
+        free(mi);
+        return err;
+    }
+
+    memset(mi->addr, 0, mi->size);
+
+    uint32_t *test = mi->addr;
+    *test = 0x12345678;
+
+    phi->msg = mi;
+
+    return SYS_ERR_OK;
+}
+
+/**
+ * \brief polls the shared messaging frame for a new message
+ *
+ * \param phi the xeon phi to poll
+ *
+ * \return SYS_ERR_OK on success
+ */
+errval_t messaging_poll(struct xeon_phi *phi)
+{
+    if (phi->msg == NULL) {
+        return -1;
+    }
+
+    uint32_t *test = phi->msg->addr;
+    assert(*test == 0x12345678);
+    test++;
+    if (*test) {
+        debug_printf("got message: %x\n", *test);
+    }
+
+    return SYS_ERR_OK;
+}
+
+
+/**
+ * \brief registers a new frame for the shared messaging channel to be used
+ *        for communication purposes
+ *
+ * \param phi   the card to initialize the messaging for
+ * \param frame capabilitz representing the frame to be used
+ */
+errval_t messaging_register(struct xeon_phi *phi,
+                            struct capref frame)
+{
+    return SYS_ERR_OK;
+}
diff --git a/usr/drivers/xeon_phi/messaging.h b/usr/drivers/xeon_phi/messaging.h
new file mode 100644 (file)
index 0000000..415778d
--- /dev/null
@@ -0,0 +1,56 @@
+/**
+ * \file
+ * \brief Driver for booting the Xeon Phi Coprocessor card on a Barrelfish Host
+ */
+
+/*
+ * Copyright (c) 2014 ETH Zurich.
+ * All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+#ifndef XEON_PHI_MESSAGING_H
+#define XEON_PHI_MESSAGING_H
+
+struct msg_info {
+    struct capref frame;
+    lpaddr_t base;
+    size_t size;
+    void *addr;
+};
+
+/**
+ * \brief initializes the messaging boostrap infrastructure between the
+ *        host and the card
+ *
+ * \param phi the xeon phi to initialize the basic messaging bootstrap
+ *
+ * \return SYS_ERR_OK on success
+ */
+errval_t messaging_init(struct xeon_phi *phi);
+
+
+/**
+ * \brief polls the shared messaging frame for a new message
+ *
+ * \param phi the xeon phi to poll
+ *
+ * \return SYS_ERR_OK on success
+ */
+errval_t messaging_poll(struct xeon_phi *phi);
+
+/**
+ * \brief registers a new frame for the shared messaging channel to be used
+ *        for communication purposes
+ *
+ * \param phi   the card to initialize the messaging for
+ * \param frame capabilitz representing the frame to be used
+ */
+errval_t messaging_register(struct xeon_phi *phi,
+                            struct capref frame);
+
+
+#endif /* XEON_PHI_MESSAGING_H_ */
index 9425790..9e8fc1e 100644 (file)
 
 #include "xeon_phi.h"
 #include "service.h"
+#include "messaging.h"
 
 static uint32_t is_exported;
 
 static iref_t svc_iref;
 
-static inline errval_t
-handle_messages(void)
+static inline errval_t handle_messages(void)
 {
     uint32_t data = xeon_phi_serial_handle_recv();
     errval_t err = event_dispatch_non_block(get_default_waitset());
@@ -48,14 +48,12 @@ handle_messages(void)
  * Intra Xeon Phi Driver Communication Regigistration
  */
 
-static void
-register_response_sent_cb(void *a)
+static void register_response_sent_cb(void *a)
 {
 
 }
 
-static void
-register_response_send(void *a)
+static void register_response_send(void *a)
 {
     errval_t err;
 
@@ -85,9 +83,8 @@ register_response_send(void *a)
 /**
  *
  */
-static void
-register_call_recv(struct xeon_phi_binding *_binding,
-                   uint8_t id)
+static void register_call_recv(struct xeon_phi_binding *_binding,
+                               uint8_t id)
 {
 
     assert(((struct xnode * )(_binding->st))->binding != _binding);
@@ -99,8 +96,10 @@ register_call_recv(struct xeon_phi_binding *_binding,
 
     phi->connected++;
 
-    XSERVICE_DEBUG("[%u] New register call: id=0x%x, num_connected=%i\n", phi->id,
-                   id, phi->connected);
+    XSERVICE_DEBUG("[%u] New register call: id=0x%x, num_connected=%i\n",
+                   phi->id,
+                   id,
+                   phi->connected);
 
     _binding->st = &phi->topology[id];
 
@@ -110,9 +109,8 @@ register_call_recv(struct xeon_phi_binding *_binding,
 /**
  *
  */
-static void
-register_response_recv(struct xeon_phi_binding *_binding,
-                       xeon_phi_errval_t msgerr)
+static void register_response_recv(struct xeon_phi_binding *_binding,
+                                   xeon_phi_errval_t msgerr)
 {
     assert(((struct xnode * )(_binding->st))->binding == _binding);
 
@@ -126,17 +124,17 @@ register_response_recv(struct xeon_phi_binding *_binding,
     }
 
     XSERVICE_DEBUG("[%u] New register response: 0x%lx, num_connected=%u\n",
-                   topology->local->id, msgerr, topology->local->connected);
+                   topology->local->id,
+                   msgerr,
+                   topology->local->connected);
 }
 
-static void
-register_call_sent_cb(void *a)
+static void register_call_sent_cb(void *a)
 {
 
 }
 
-static void
-register_call_send(void *a)
+static void register_call_send(void *a)
 {
     errval_t err;
 
@@ -162,16 +160,16 @@ register_call_send(void *a)
 /// Receive handler table
 static struct xeon_phi_rx_vtbl xps_rx_vtbl = {
     .register_call = register_call_recv,
-    .register_response = register_response_recv };
+    .register_response = register_response_recv
+};
 
 /*
  * ---------------------------------------------------------------------------
  * Service Setup
  */
-static void
-svc_bind_cb(void *st,
-            errval_t err,
-            struct xeon_phi_binding *b)
+static void svc_bind_cb(void *st,
+                        errval_t err,
+                        struct xeon_phi_binding *b)
 {
     struct xnode *node = st;
 
@@ -182,14 +180,16 @@ svc_bind_cb(void *st,
     node->state = XNODE_STATE_REGISTERING;
 }
 
-static errval_t
-svc_register(struct xnode *node)
+static errval_t svc_register(struct xnode *node)
 {
     XSERVICE_DEBUG("binding to node %i (iref = 0x%x)\n", node->id, node->iref);
     errval_t err;
 
-    err = xeon_phi_bind(node->iref, svc_bind_cb, node, get_default_waitset(),
-    IDC_BIND_FLAGS_DEFAULT);
+    err = xeon_phi_bind(node->iref,
+                        svc_bind_cb,
+                        node,
+                        get_default_waitset(),
+                        IDC_BIND_FLAGS_DEFAULT);
     if (err_is_fail(err)) {
         node->state = XNODE_STATE_FAILURE;
         return err;
@@ -198,9 +198,8 @@ svc_register(struct xnode *node)
     return SYS_ERR_OK;
 }
 
-static errval_t
-svc_connect_cb(void *st,
-               struct xeon_phi_binding *b)
+static errval_t svc_connect_cb(void *st,
+                               struct xeon_phi_binding *b)
 {
     struct xeon_phi *phi = st;
 
@@ -211,10 +210,9 @@ svc_connect_cb(void *st,
     return SYS_ERR_OK;
 }
 
-static void
-svc_export_cb(void *st,
-              errval_t err,
-              iref_t iref)
+static void svc_export_cb(void *st,
+                          errval_t err,
+                          iref_t iref)
 {
     if (err_is_fail(err)) {
         svc_iref = 0x0;
@@ -236,8 +234,7 @@ svc_export_cb(void *st,
  *
  * \return SYS_ERR_OK on success
  */
-errval_t
-service_init(struct xeon_phi *phi)
+errval_t service_init(struct xeon_phi *phi)
 {
     errval_t err;
 
@@ -245,8 +242,11 @@ service_init(struct xeon_phi *phi)
         phi->topology[i].local = phi;
     }
 
-    err = xeon_phi_export(phi, svc_export_cb, svc_connect_cb, get_default_waitset(),
-    IDC_EXPORT_FLAGS_DEFAULT);
+    err = xeon_phi_export(phi,
+                          svc_export_cb,
+                          svc_connect_cb,
+                          get_default_waitset(),
+                          IDC_EXPORT_FLAGS_DEFAULT);
     if (err_is_fail(err)) {
         return err;
     }
@@ -271,10 +271,9 @@ service_init(struct xeon_phi *phi)
  * \param irefs the irefs of the other cards
  * \param num   the number of irefs in the array
  */
-errval_t
-service_register(struct xeon_phi *phi,
-                 iref_t *irefs,
-                 size_t num)
+errval_t service_register(struct xeon_phi *phi,
+                          iref_t *irefs,
+                          size_t num)
 {
     errval_t err;
     struct xnode *xnode;
@@ -316,7 +315,7 @@ service_register(struct xeon_phi *phi,
         }
     }
 
-    XSERVICE_DEBUG("Registring with other %i Xeon Phi done.\n", (uint32_t)num - 1);
+    XSERVICE_DEBUG("Registring with other %i Xeon Phi done.\n", (uint32_t )num - 1);
 
     return SYS_ERR_OK;
 }
@@ -324,11 +323,11 @@ service_register(struct xeon_phi *phi,
 /**
  * \brief starts the service request handling
  */
-errval_t
-service_start(void)
+errval_t service_start(struct xeon_phi *phi)
 {
     errval_t err;
     while (1) {
+        err = messaging_poll(phi);
         err = handle_messages();
         if (err_is_fail(err)) {
             return err;
index f11c388..cc3d80d 100644 (file)
@@ -38,6 +38,6 @@ errval_t service_register(struct xeon_phi *phi, iref_t *irefs, size_t num);
 /**
  * \brief starts the service request handling
  */
-errval_t service_start(void);
+errval_t service_start(struct xeon_phi *phi);
 
 #endif // XEON_PHI_SERVICE_H_
index 173ef82..1b62083 100644 (file)
@@ -137,6 +137,11 @@ struct xeon_phi
     struct mbar mmio;       ///< pointer to the MMIO address range
     struct mbar apt;        ///< pointer to the aperture address range
 
+    lvaddr_t os_offset;     ///< offset of the OS image into the aperture
+    uint32_t os_size;       ///< the size of the OS image
+    char *cmdline;          ///< pointer to the bootloader cmdline
+    uint32_t cmdlen;     ///< the length of the cmd line
+
     uint8_t id;             ///< card id for identifying the card
     iref_t iref;
     uint32_t apicid;        ///< APIC id used for sending the boot interrupt
@@ -144,11 +149,12 @@ struct xeon_phi
     uint8_t      connected;
     struct xnode topology[XEON_PHI_NUM_MAX];
 
-    char *cmdline;          ///< pointer to the bootloader cmdline
+
 
     struct smpt_info *smpt;  ///< pointer to the SMPT information struct
     struct irq_info *irq;  ///< pointer to the IRQ information struct
-    struct dma_infi *dma;  ///< pointer to the DMA information struct
+    struct dma_info *dma;  ///< pointer to the DMA information struct
+    struct msg_info *msg;
 };
 
 /**
index eaabbd7..737d950 100644 (file)
@@ -75,6 +75,15 @@ bus_driver{
     platforms: ['x86_64', 'x86_32']
 }.
 
+pci_driver{
+    binary: "xeon_phi",
+    supported_cards:
+    [ pci_card{ vendor: 16'8086, device: 16'225e, function: _, subvendor: _, subdevice: _ } ],
+    core_hint: 0,
+    interrupt_load: 0.5,
+    platforms: ['x86_64']
+}.
+
 %
 % Driver selection logic
 %