From: "H. Peter Anvin" <hpa@zytor.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Thomas Renninger <trenn@suse.de>,
eric.piel@tremplin-utc.net, vojcek@tlen.pl, dsdt@gaugusch.at,
linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org,
x86@kernel.org, Lin Ming <ming.m.lin@intel.com>,
lenb@kernel.org, robert.moore@intel.com,
Al Viro <viro@zeniv.linux.org.uk>,
Harald Hoyer <harald@redhat.com>
Subject: Re: [PATCH] ACPI: Implement overriding of arbitrary ACPI tables via initrd
Date: Sat, 24 Mar 2012 15:21:01 -0700 [thread overview]
Message-ID: <4F6E48CD.9050002@zytor.com> (raw)
In-Reply-To: <20120324191718.GA3927@phenom.dumpdata.com>
[-- Attachment #1: Type: text/plain, Size: 601 bytes --]
The attached cpio-parsing code compiles to 458 bytes on x86-64 and 476
bytes on i386, and that is without any library dependencies at all.
Again, it will completely stop at the first compressed data item, so any
such kernel objects absolutely will have to be first. In good Linux
tradition, it is also completely untested.
However, given that very reasonable size I would think that this is a
reasonable approach. Anyone who has a better suggestion for the
namespace than "kernel/"?
-hpa
--
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel. I don't speak on their behalf.
[-- Attachment #2: findcpio.c --]
[-- Type: text/x-csrc, Size: 2508 bytes --]
/*
* findcpio.c
*
* Find a specific cpio member; must precede any compressed content.
*/
#include <stddef.h>
#include <stdbool.h>
struct cpio_data {
void *data;
unsigned long size;
};
enum cpio_fields {
C_INO,
C_MODE,
C_UID,
C_GID,
C_NLINK,
C_MTIME,
C_FILESIZE,
C_MAJ,
C_MIN,
C_RMAJ,
C_RMIN,
C_NAMESIZE,
C_CHKSUM,
C_NFIELDS
};
/* Return true if this field is composed of valid hex digits */
static bool validhex(const char *ptr, int len)
{
unsigned char c, x;
while (len--) {
c = *ptr++;
x = c - '0';
if (x < 10)
continue;
x = (c | 0x20) - 'a' + 10;
if (x < 16)
continue;
return false;
}
return true;
}
/* Return the value of an already validated field */
static unsigned int hexval(const char *ptr, int len)
{
unsigned int v = 0;
unsigned char c, x;
while (len--) {
v <<= 4;
c = *ptr++;
x = c - '0';
if (x < 10) {
v += x;
continue;
}
x = (c | 0x20) - 'a' + 10;
v += x;
}
return v;
}
static int mystrlen(const char *name)
{
int n = 0;
while (*name++)
n++;
return n;
}
#if 0
# define memcmp(p1, p2, n) __builtin_memcmp(p1, p2, n)
#else
static int memcmp(const void *p1, const void *p2, size_t n)
{
const unsigned char *u1 = p1;
const unsigned char *u2 = p2;
int d;
while (n--) {
d = *u2 - *u1;
if (d)
return d;
}
return 0;
}
#endif
#define ALIGN4(p) ((void *)(((size_t)p + 3) & ~3))
struct cpio_data find_cpio_data(const char *name, const void *data, size_t len)
{
const size_t cpio_header_len = 6 + 8*C_NFIELDS;
struct cpio_data cd = { NULL, 0 };
const char *p, *dptr, *nptr;
unsigned int magic, ch[C_NFIELDS], *chp;
unsigned int mynamesize = mystrlen(name) + 1;
int i;
p = data;
while (len > cpio_header_len) {
if (!*p) {
/* All cpio headers need to be 4-byte aligned */
p += 4;
len -= 4;
continue;
}
if (!validhex(p, cpio_header_len))
break; /* Not a valid cpio header */
magic = hexval(p, 6);
if ((magic - 0x070701) > 1)
break; /* Not a valid cpio magic */
p += 6;
chp = ch;
for (i = 0; i < C_NFIELDS; i++) {
*chp++ = hexval(p, 8);
p += 8;
}
len -= cpio_header_len;
dptr = ALIGN4(p + ch[C_NAMESIZE]);
nptr = ALIGN4(dptr + ch[C_FILESIZE]);
if (nptr > p + len)
break; /* Buffer overrun */
if ((ch[C_MODE] & 0170000) == 0100000 &&
ch[C_NAMESIZE] == mynamesize &&
memcmp(p, name, mynamesize)) {
cd.data = (void *)dptr;
cd.size = ch[C_FILESIZE];
break;
}
len -= (nptr - p);
p = nptr;
}
return cd;
}
next prev parent reply other threads:[~2012-03-24 22:21 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-23 14:29 [PATCH] ACPI: Implement overriding of arbitrary ACPI tables via initrd Thomas Renninger
2012-03-23 15:51 ` Thomas Renninger
2012-03-23 20:05 ` H. Peter Anvin
2012-03-24 1:42 ` Thomas Renninger
2012-03-24 2:01 ` H. Peter Anvin
2012-03-24 3:02 ` Thomas Renninger
2012-03-24 4:40 ` H. Peter Anvin
2012-03-24 4:43 ` H. Peter Anvin
2012-03-24 4:50 ` Yinghai Lu
2012-03-24 4:58 ` H. Peter Anvin
2012-03-24 9:24 ` Borislav Petkov
2012-03-24 18:49 ` H. Peter Anvin
2012-03-25 8:54 ` Borislav Petkov
2012-03-26 1:36 ` H. Peter Anvin
2012-03-26 14:21 ` Konrad Rzeszutek Wilk
2012-03-26 0:45 ` Thomas Renninger
2012-03-26 1:25 ` H. Peter Anvin
2012-03-26 14:19 ` Thomas Renninger
2012-03-26 14:46 ` H. Peter Anvin
2012-03-26 14:51 ` Thomas Renninger
2012-03-27 4:15 ` H. Peter Anvin
2012-03-27 4:46 ` Peter Stuge
2012-03-27 6:18 ` H. Peter Anvin
2012-03-24 18:42 ` Konrad Rzeszutek Wilk
2012-03-24 19:15 ` H. Peter Anvin
2012-03-24 19:17 ` Konrad Rzeszutek Wilk
2012-03-24 19:44 ` H. Peter Anvin
2012-03-24 22:21 ` H. Peter Anvin [this message]
2012-03-24 22:44 ` H. Peter Anvin
2012-03-25 9:25 ` Borislav Petkov
2012-03-25 23:29 ` H. Peter Anvin
2012-03-25 4:17 ` H. Peter Anvin
2012-03-25 9:07 ` Borislav Petkov
2012-03-23 20:54 ` Yinghai Lu
2012-03-24 0:15 ` Yinghai Lu
2012-03-24 1:05 ` Yinghai Lu
2012-03-24 1:22 ` Thomas Renninger
2012-03-24 1:26 ` Thomas Renninger
2012-03-24 4:41 ` Yinghai Lu
2012-03-26 0:45 ` Thomas Renninger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4F6E48CD.9050002@zytor.com \
--to=hpa@zytor.com \
--cc=dsdt@gaugusch.at \
--cc=eric.piel@tremplin-utc.net \
--cc=harald@redhat.com \
--cc=konrad.wilk@oracle.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ming.m.lin@intel.com \
--cc=robert.moore@intel.com \
--cc=trenn@suse.de \
--cc=viro@zeniv.linux.org.uk \
--cc=vojcek@tlen.pl \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox