mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 05:35:25 +00:00
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:
parent
0464ab183d
commit
347081effa
@ -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) {
|
||||
|
17
tests/sysinfodata/armcpuinfo.data
Normal file
17
tests/sysinfodata/armcpuinfo.data
Normal 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
|
10
tests/sysinfodata/armsysinfo.expect
Normal file
10
tests/sysinfodata/armsysinfo.expect
Normal 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>
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user