103 lines
4.2 KiB
Diff
103 lines
4.2 KiB
Diff
|
# Commit 39c6664a0e6e1b4ed80660d545dff34ce41bee31
|
||
|
# Date 2015-07-07 15:10:45 +0100
|
||
|
# Author Ian Campbell <ian.campbell@citrix.com>
|
||
|
# Committer Ian Campbell <ian.campbell@citrix.com>
|
||
|
xen: earlycpio: Pull in latest linux earlycpio.[ch]
|
||
|
|
||
|
AFAICT our current version does not correspond to any version in the
|
||
|
Linux history. This commit resynchronised to the state in Linux
|
||
|
commit 598bae70c2a8e35c8d39b610cca2b32afcf047af.
|
||
|
|
||
|
Differences from upstream: find_cpio_data is __init, printk instead of
|
||
|
pr_*.
|
||
|
|
||
|
This appears to fix Debian bug #785187. "Appears" because my test box
|
||
|
happens to be AMD and the issue is that the (valid) cpio generated by
|
||
|
the Intel ucode is not liked by the old Xen code. I've tested by
|
||
|
hacking the hypervisor to look for the Intel path.
|
||
|
|
||
|
Reported-by: Stephan Seitz <stse+debianbugs@fsing.rootsland.net>
|
||
|
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
|
||
|
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||
|
Cc: Jan Beulich <jbeulich@suse.com>
|
||
|
Cc: Stephan Seitz <stse+debianbugs@fsing.rootsland.net>
|
||
|
Cc: 785187@bugs.debian.org
|
||
|
Acked-by: Jan Beulich <jbeulich@suse.com>
|
||
|
|
||
|
--- a/xen/common/earlycpio.c
|
||
|
+++ b/xen/common/earlycpio.c
|
||
|
@@ -54,25 +54,26 @@ enum cpio_fields {
|
||
|
|
||
|
/**
|
||
|
* cpio_data find_cpio_data - Search for files in an uncompressed cpio
|
||
|
- * @path: The directory to search for, including a slash at the end
|
||
|
- * @data: Pointer to the the cpio archive or a header inside
|
||
|
- * @len: Remaining length of the cpio based on data pointer
|
||
|
- * @offset: When a matching file is found, this is the offset to the
|
||
|
- * beginning of the cpio. It can be used to iterate through
|
||
|
- * the cpio to find all files inside of a directory path
|
||
|
+ * @path: The directory to search for, including a slash at the end
|
||
|
+ * @data: Pointer to the the cpio archive or a header inside
|
||
|
+ * @len: Remaining length of the cpio based on data pointer
|
||
|
+ * @nextoff: When a matching file is found, this is the offset from the
|
||
|
+ * beginning of the cpio to the beginning of the next file, not the
|
||
|
+ * matching file itself. It can be used to iterate through the cpio
|
||
|
+ * to find all files inside of a directory path.
|
||
|
*
|
||
|
- * @return: struct cpio_data containing the address, length and
|
||
|
- * filename (with the directory path cut off) of the found file.
|
||
|
- * If you search for a filename and not for files in a directory,
|
||
|
- * pass the absolute path of the filename in the cpio and make sure
|
||
|
- * the match returned an empty filename string.
|
||
|
+ * @return: struct cpio_data containing the address, length and
|
||
|
+ * filename (with the directory path cut off) of the found file.
|
||
|
+ * If you search for a filename and not for files in a directory,
|
||
|
+ * pass the absolute path of the filename in the cpio and make sure
|
||
|
+ * the match returned an empty filename string.
|
||
|
*/
|
||
|
|
||
|
struct cpio_data __init find_cpio_data(const char *path, void *data,
|
||
|
- size_t len, long *offset)
|
||
|
+ size_t len, long *nextoff)
|
||
|
{
|
||
|
const size_t cpio_header_len = 8*C_NFIELDS - 2;
|
||
|
- struct cpio_data cd = { NULL, 0 };
|
||
|
+ struct cpio_data cd = { NULL, 0, "" };
|
||
|
const char *p, *dptr, *nptr;
|
||
|
unsigned int ch[C_NFIELDS], *chp, v;
|
||
|
unsigned char c, x;
|
||
|
@@ -129,17 +130,17 @@ struct cpio_data __init find_cpio_data(c
|
||
|
if ((ch[C_MODE] & 0170000) == 0100000 &&
|
||
|
ch[C_NAMESIZE] >= mypathsize &&
|
||
|
!memcmp(p, path, mypathsize)) {
|
||
|
- *offset = (long)nptr - (long)data;
|
||
|
+ *nextoff = (long)nptr - (long)data;
|
||
|
if (ch[C_NAMESIZE] - mypathsize >= MAX_CPIO_FILE_NAME) {
|
||
|
printk(
|
||
|
"File %s exceeding MAX_CPIO_FILE_NAME [%d]\n",
|
||
|
p, MAX_CPIO_FILE_NAME);
|
||
|
}
|
||
|
- if (ch[C_NAMESIZE] - 1 /* includes \0 */ == mypathsize) {
|
||
|
- cd.data = (void *)dptr;
|
||
|
- cd.size = ch[C_FILESIZE];
|
||
|
- return cd; /* Found it! */
|
||
|
- }
|
||
|
+ strlcpy(cd.name, p + mypathsize, MAX_CPIO_FILE_NAME);
|
||
|
+
|
||
|
+ cd.data = (void *)dptr;
|
||
|
+ cd.size = ch[C_FILESIZE];
|
||
|
+ return cd; /* Found it! */
|
||
|
}
|
||
|
len -= (nptr - p);
|
||
|
p = nptr;
|
||
|
--- a/xen/include/xen/earlycpio.h
|
||
|
+++ b/xen/include/xen/earlycpio.h
|
||
|
@@ -6,6 +6,7 @@
|
||
|
struct cpio_data {
|
||
|
void *data;
|
||
|
size_t size;
|
||
|
+ char name[MAX_CPIO_FILE_NAME];
|
||
|
};
|
||
|
|
||
|
struct cpio_data find_cpio_data(const char *path, void *data, size_t len,
|