summaryrefslogtreecommitdiffstats
path: root/include/input
diff options
context:
space:
mode:
authorFengwei Yin <fengwei.yin@intel.com>2014-05-24 05:32:09 +0800
committerNarayan Kamath <narayan@google.com>2014-05-30 14:13:29 +0100
commit83e0e425c61c4e03f61114a88f117db1553cd44c (patch)
tree98c5e19957fb5dc572af416b04a52767a2691b20 /include/input
parent63645c69e03cf3862c52cfde6cbd5f5143ccd38a (diff)
downloadframeworks_native-83e0e425c61c4e03f61114a88f117db1553cd44c.zip
frameworks_native-83e0e425c61c4e03f61114a88f117db1553cd44c.tar.gz
frameworks_native-83e0e425c61c4e03f61114a88f117db1553cd44c.tar.bz2
x86_64: Align uint64_t/int64_t structure member to 8 bytes
To make sure the stature which pass between 32/64bit process have same memory layout for 32/64bit. Signed-off-by: Fengwei Yin <fengwei.yin@intel.com> Co-Authored-by: Narayan Kamath <narayan@google.com> (Unit test only.) Change-Id: I1bc2d12cce41ec0bc484adcaf968f274bec75c12
Diffstat (limited to 'include/input')
-rw-r--r--include/input/Input.h2
-rw-r--r--include/input/InputTransport.h22
2 files changed, 16 insertions, 8 deletions
diff --git a/include/input/Input.h b/include/input/Input.h
index e778076..7c662a7 100644
--- a/include/input/Input.h
+++ b/include/input/Input.h
@@ -170,7 +170,7 @@ struct PointerCoords {
enum { MAX_AXES = 14 }; // 14 so that sizeof(PointerCoords) == 64
// Bitfield of axes that are present in this structure.
- uint64_t bits;
+ uint64_t bits __attribute__((aligned(8)));
// Values of axes that are stored in this structure packed in order by axis id
// for each axis that is present in the structure according to 'bits'.
diff --git a/include/input/InputTransport.h b/include/input/InputTransport.h
index 8ffdfca..e7e383b 100644
--- a/include/input/InputTransport.h
+++ b/include/input/InputTransport.h
@@ -39,6 +39,9 @@ namespace android {
/*
* Intermediate representation used to send input events and related signals.
+ *
+ * Note that this structure is used for IPCs so its layout must be identical
+ * on 64 and 32 bit processes. This is tested in StructLayout_test.cpp.
*/
struct InputMessage {
enum {
@@ -49,13 +52,17 @@ struct InputMessage {
struct Header {
uint32_t type;
- uint32_t padding; // 8 byte alignment for the body that follows
+ // We don't need this field in order to align the body below but we
+ // leave it here because InputMessage::size() and other functions
+ // compute the size of this structure as sizeof(Header) + sizeof(Body).
+ uint32_t padding;
} header;
+ // Body *must* be 8 byte aligned.
union Body {
struct Key {
uint32_t seq;
- nsecs_t eventTime;
+ nsecs_t eventTime __attribute__((aligned(8)));
int32_t deviceId;
int32_t source;
int32_t action;
@@ -64,7 +71,7 @@ struct InputMessage {
int32_t scanCode;
int32_t metaState;
int32_t repeatCount;
- nsecs_t downTime;
+ nsecs_t downTime __attribute__((aligned(8)));
inline size_t size() const {
return sizeof(Key);
@@ -73,7 +80,7 @@ struct InputMessage {
struct Motion {
uint32_t seq;
- nsecs_t eventTime;
+ nsecs_t eventTime __attribute__((aligned(8)));
int32_t deviceId;
int32_t source;
int32_t action;
@@ -81,13 +88,14 @@ struct InputMessage {
int32_t metaState;
int32_t buttonState;
int32_t edgeFlags;
- nsecs_t downTime;
+ nsecs_t downTime __attribute__((aligned(8)));
float xOffset;
float yOffset;
float xPrecision;
float yPrecision;
uint32_t pointerCount;
- struct Pointer {
+ // Note that PointerCoords requires 8 byte alignment.
+ struct Pointer{
PointerProperties properties;
PointerCoords coords;
} pointers[MAX_POINTERS];
@@ -112,7 +120,7 @@ struct InputMessage {
return sizeof(Finished);
}
} finished;
- } body;
+ } __attribute__((aligned(8))) body;
bool isValid(size_t actualSize) const;
size_t size() const;