Hi,

Can you please take a look at this, Flavio?

```
subsystem test 10;

type int64_t = MACH_MSG_TYPE_INTEGER_64;

type time_value64_t             = struct {
   int64_t seconds;
   int64_t nanoseconds;
};

type time_value64_2_t = struct[2] of int64_t;
```

I would expect the above two definitions to equate to the same interface 
structures, but on 32 bit MiG they do not:

```
Subsystem test: base = 10

Type int64_t = (MACH_MSG_TYPE_INTEGER_64, 64)

Type time_value64_t = struct [4] of (MACH_MSG_TYPE_INTEGER_32, 32)

Type time_value64_2_t = struct [2] of (MACH_MSG_TYPE_INTEGER_64, 64)
```

It seems complex_alignof = 4 is causing the structures to recompute 
their member sizes.  Now while the total number of bytes still matches,
on (__LP64__ && USER32) kernel with 32 bit userspace, mig_usize is 
computed differently in the user32 case, thus we get a MIG_TYPE_ERROR on 
some RPCs that use 64 bit types embedded in structs.  For example:

gnumach-test-failure MIG_TYPE_ERROR (0xfffffed4): host_get_time64

Firstly, is this a mig bug?  If so, how do we fix it?

Cheers,
Damien



Reply via email to