Implement minimal sysinfo for ARM platforms

Implement the bare minimal sysinfo for ARM platforms by
reading the CPU models from /proc/cpuinfo

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2013-04-03 18:58:50 +01:00
parent 0464ab183d
commit 347081effa
4 changed files with 169 additions and 2 deletions

View File

@ -255,8 +255,134 @@ no_memory:
return NULL;
}
#elif defined(__s390__) || defined(__s390x__)
#elif defined(__arm__)
static int
virSysinfoParseSystem(const char *base, virSysinfoDefPtr ret)
{
char *eol = NULL;
const char *cur;
if ((cur = strstr(base, "platform")) == NULL)
return 0;
base = cur;
/* Account for format 'platform : XXXX'*/
cur = strchr(cur, ':') + 1;
eol = strchr(cur, '\n');
virSkipSpaces(&cur);
if (eol &&
((ret->system_family = strndup(cur, eol - cur)) == NULL))
goto no_memory;
if ((cur = strstr(base, "model")) != NULL) {
cur = strchr(cur, ':') + 1;
eol = strchr(cur, '\n');
virSkipSpaces(&cur);
if (eol && ((ret->system_serial = strndup(cur, eol - cur))
== NULL))
goto no_memory;
}
if ((cur = strstr(base, "machine")) != NULL) {
cur = strchr(cur, ':') + 1;
eol = strchr(cur, '\n');
virSkipSpaces(&cur);
if (eol && ((ret->system_version = strndup(cur, eol - cur))
== NULL))
goto no_memory;
}
return 0;
no_memory:
return -1;
}
static int
virSysinfoParseProcessor(const char *base, virSysinfoDefPtr ret)
{
const char *cur;
char *eol, *tmp_base;
virSysinfoProcessorDefPtr processor;
char *processor_type = NULL;
if (!(tmp_base = strstr(base, "Processor")))
return 0;
base = tmp_base;
eol = strchr(base, '\n');
cur = strchr(base, ':') + 1;
virSkipSpaces(&cur);
if (eol &&
((processor_type = strndup(cur, eol - cur))
== NULL))
goto no_memory;
base = cur;
while ((tmp_base = strstr(base, "processor")) != NULL) {
base = tmp_base;
eol = strchr(base, '\n');
cur = strchr(base, ':') + 1;
if (VIR_EXPAND_N(ret->processor, ret->nprocessor, 1) < 0) {
goto no_memory;
}
processor = &ret->processor[ret->nprocessor - 1];
virSkipSpaces(&cur);
if (eol &&
((processor->processor_socket_destination = strndup
(cur, eol - cur)) == NULL))
goto no_memory;
if (processor_type &&
!(processor->processor_type = strdup(processor_type)))
goto no_memory;
base = cur;
}
VIR_FREE(processor_type);
return 0;
no_memory:
VIR_FREE(processor_type);
return -1;
}
/* virSysinfoRead for ARMv7
* Gathers sysinfo data from /proc/cpuinfo */
virSysinfoDefPtr
virSysinfoRead(void) {
virSysinfoDefPtr ret = NULL;
char *outbuf = NULL;
if (VIR_ALLOC(ret) < 0)
goto no_memory;
if (virFileReadAll(CPUINFO, 2048, &outbuf) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to open %s"), CPUINFO);
return NULL;
}
ret->nprocessor = 0;
ret->processor = NULL;
if (virSysinfoParseProcessor(outbuf, ret) < 0)
goto no_memory;
if (virSysinfoParseSystem(outbuf, ret) < 0)
goto no_memory;
return ret;
no_memory:
VIR_FREE(outbuf);
return NULL;
}
#elif defined(__s390__) || defined(__s390x__)
/*
we need to ignore warnings about strchr caused by -Wlogical-op
for some GCC versions.
@ -403,6 +529,7 @@ no_memory:
!(defined(__x86_64__) || \
defined(__i386__) || \
defined(__amd64__) || \
defined(__arm__) || \
defined(__powerpc__))
virSysinfoDefPtr
virSysinfoRead(void) {

View File

@ -0,0 +1,17 @@
Processor : ARMv7 Processor rev 4 (v7l)
processor : 0
BogoMIPS : 1694.10
processor : 1
BogoMIPS : 1694.10
Features : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc0f
CPU revision : 4
Hardware : SAMSUNG EXYNOS5 (Flattened Device Tree)
Revision : 0000
Serial : 0000000000000000

View File

@ -0,0 +1,10 @@
<sysinfo type='smbios'>
<processor>
<entry name='socket_destination'>0</entry>
<entry name='type'>ARMv7 Processor rev 4 (v7l)</entry>
</processor>
<processor>
<entry name='socket_destination'>1</entry>
<entry name='type'>ARMv7 Processor rev 4 (v7l)</entry>
</processor>
</sysinfo>

View File

@ -40,7 +40,8 @@
# if defined(__s390__) || defined(__s390x__) || \
defined(__powerpc__) || defined(__powerpc64__) || \
defined(__i386__) || defined(__x86_64__) || defined(__amd64__)
defined(__i386__) || defined(__x86_64__) || defined(__amd64__) || \
defined(__arm__)
/* from sysinfo.c */
void virSysinfoSetup(const char *decoder,
@ -164,6 +165,18 @@ test_x86(void)
}
VIRT_TEST_MAIN(test_x86)
# elif defined(__arm__)
static int
test_arm(void)
{
return sysinfotest_run("arm sysinfo",
NULL,
NULL,
"/sysinfodata/armcpuinfo.data",
"/sysinfodata/armsysinfo.expect");
}
VIRT_TEST_MAIN(test_arm)
# else
int
main(void)