hvmloader: return MPFPS from create_mp_tables()
authorIan Campbell <ian.campbell@citrix.com>
Wed, 1 Jun 2011 15:47:27 +0000 (16:47 +0100)
committerIan Campbell <ian.campbell@citrix.com>
Wed, 1 Jun 2011 15:47:27 +0000 (16:47 +0100)
This is the hook which the mptables hang off, so it is useful to know.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
tools/firmware/hvmloader/mp_tables.c
tools/firmware/hvmloader/util.h

index 668e8dd95e38a1d913c533cbcfc45cbb55740dd0..b4e16ee3e4fb4a9857d688723d895a6e15bd7209 100644 (file)
@@ -260,17 +260,21 @@ static void fill_mpfps(struct mp_floating_pointer_struct *mpfps, uint32_t mpct)
 }
 
 /* create_mp_tables - creates MP tables for the guest based upon config data */
-void create_mp_tables(void *mp_table_base)
+unsigned long create_mp_tables(void *_mpfps)
 {
     char *p;
     int vcpu_nr, i, length;
+    void *base;
     struct mp_io_intr_entry *mpiie;
+    struct mp_floating_pointer_struct *mpfps = _mpfps;
 
     vcpu_nr = hvm_info->nr_vcpus;
 
     printf("Creating MP tables ...\n");
 
-    p = mp_table_base + sizeof(struct mp_config_table);
+    base = &mpfps[1];
+
+    p = base + sizeof(struct mp_config_table);
 
     for ( i = 0; i < vcpu_nr; i++ )
     {
@@ -308,14 +312,11 @@ void create_mp_tables(void *mp_table_base)
         p += sizeof(*mpiie);
     }
 
-    length = p - (char *)mp_table_base;
+    length = p - (char *)base;
 
-    /* find the next 16-byte boundary to place the mp floating pointer */
-    while ( (unsigned long)p & 0xF )
-        p++;
+    fill_mp_config_table((struct mp_config_table *)base, length);
 
-    fill_mpfps((struct mp_floating_pointer_struct *)p, 
-               (uint32_t)mp_table_base);
+    fill_mpfps(mpfps, (uint32_t)base);
 
-    fill_mp_config_table((struct mp_config_table *)mp_table_base, length);
+    return (unsigned long)mpfps;
 }
index a9bf47b46e8790708f7f4241d91bf2862eb7cec4..2f790db1aaed4d6e9dcdbed2d2f3b7f9c890dc77 100644 (file)
@@ -191,7 +191,7 @@ uint32_t rombios_highbios_setup(void);
 
 /* Miscellaneous. */
 void cacheattr_init(void);
-void create_mp_tables(void *table);
+unsigned long create_mp_tables(void *table);
 int hvm_write_smbios_tables(unsigned long scratch,
                            unsigned long smbios_start,
                            unsigned long smbios_end);