mirror of
https://github.com/torvalds/linux.git
synced 2024-11-12 07:01:57 +00:00
3338a65bad
The current VPHN parsing logic has some flaws that this patch aims to fix: 1) when the value 0xffff is read, the value 0xffffffff gets added to the the output list and its element count isn't incremented. This is wrong. According to PAPR+ the domain identifiers are packed into a sequence terminated by the "reserved value of all ones". This means that 0xffff is a stream terminator. 2) the combination of byteswaps and casts make the code hardly readable. Let's parse the stream one 16-bit field at a time instead. 3) it is assumed that the hypercall returns 12 32-bit values packed into 6 64-bit registers. According to PAPR+, the domain identifiers may be streamed as 16-bit values. Let's increase the number of expected numbers to 24. Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
17 lines
489 B
C
17 lines
489 B
C
#ifndef _ARCH_POWERPC_MM_VPHN_H_
|
|
#define _ARCH_POWERPC_MM_VPHN_H_
|
|
|
|
/* The H_HOME_NODE_ASSOCIATIVITY h_call returns 6 64-bit registers.
|
|
*/
|
|
#define VPHN_REGISTER_COUNT 6
|
|
|
|
/*
|
|
* 6 64-bit registers unpacked into up to 24 be32 associativity values. To
|
|
* form the complete property we have to add the length in the first cell.
|
|
*/
|
|
#define VPHN_ASSOC_BUFSIZE (VPHN_REGISTER_COUNT*sizeof(u64)/sizeof(u16) + 1)
|
|
|
|
extern int vphn_unpack_associativity(const long *packed, __be32 *unpacked);
|
|
|
|
#endif
|