john.levon(a)sun.com wrote:
...
Hi John,
This looks fine, but there are a couple of nits.
+#ifdef __sun
+
+static int
+get_cpu_flags(virConnectPtr conn, const char **hvm, int *pae, int *longmode)
+{
+ struct {
+ uint32_t r_eax, r_ebx, r_ecx, r_edx;
+ } regs;
+
+ char tmpbuf[20];
+ int fd = -1;
No need to initialize.
+ int ret = 0;
+
+ /* returns -1, errno 22 if in 32-bit mode */
+ *longmode = (sysinfo(SI_ARCHITECTURE_64, tmpbuf, 20) != -1);
It'd be nice to use "sizeof tmpbuf", rather than
repeating the literal size, "20".
+ if ((fd = open("/dev/cpu/self/cpuid", O_RDONLY)) == -1
||
+ pread(fd, ®s, sizeof(regs), 0) != sizeof(regs)) {
+ virXenError(conn, VIR_ERR_SYSTEM_ERROR,
+ "couldn't read CPU flags: %s", strerror(errno));
+ goto out;
+ }
+
+ *pae = 0;
+ *hvm = "";
+
+ if (strncmp((const char *)®s.r_ebx, "AuthcAMDenti", 12) == 0) {
You'll have to use STREQLEN in place of that strncmp,
in order for "make syntax-check" to pass.
+ if (pread(fd, ®s, sizeof (regs), 0x80000001) ==
sizeof (regs)) {
+ /* Read secure virtual machine bit (bit 2 of ECX feature ID) */
+ if ((regs.r_ecx >> 2) & 1) {
+ *hvm = "svm";
+ }
+ if ((regs.r_edx >> 6) & 1)
+ *pae = 1;
+ }
+ } else if (strncmp((const char *)®s.r_ebx, "GenuntelineI", 12) ==
0) {
Here, too.
...
+ /* Really, this never fails - look at the man-page. */
+ uname (&utsname);