File: fix_64bit_mem_addr.patch

package info (click to toggle)
mcelog 104-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 996 kB
  • ctags: 1,508
  • sloc: ansic: 7,739; sh: 481; makefile: 87
file content (130 lines) | stat: -rw-r--r-- 4,778 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
Description: Use 64bit types for memory addresses
 mcelog reads 64-bit addresses from the MCE, but passes them around with
 type unsigned long, which causes mcelog --dmi to give incorrect
 results on 32-bit systems with more than 4 GiB of RAM.
Origin: other, http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=5;bug=437022
Bug-Debian: http://bugs.debian.org/437022
Author: Anders Kaseorg <andersk@MIT.EDU>
Author: Julien BLACHE <jblache@debian.org>

Index: mcelog-1.0~pre3-72-gcbd4da4/dimm.c
===================================================================
--- mcelog-1.0~pre3-72-gcbd4da4.orig/dimm.c	2011-07-20 18:44:28.505446683 +0200
+++ mcelog-1.0~pre3-72-gcbd4da4/dimm.c	2011-07-20 18:44:29.961434285 +0200
@@ -351,14 +351,14 @@
 		Eprintf("Cannot run error trigger %s for %s\n", trigger, loc);
 	open_dimm_db(NULL);
 }
-void new_error(unsigned long addr, unsigned long max_error, char *trigger)
+void new_error(unsigned long long addr, unsigned long max_error, char *trigger)
 {
 	struct dmi_memdev **devs;
 	int i;
 
 	devs = dmi_find_addr(addr);
 	if (devs[0] == NULL) {
-		Wprintf("No memory found for address %lx\n", addr);
+		Wprintf("No memory found for address %Lx\n", addr);
 		exit(1);
 	}
 	for (i = 0; devs[i]; i++) {
@@ -366,7 +366,7 @@
 		char *loc = dmi_getstring(&d->header, d->device_locator);
 		struct group *g = find_entry(dimm_db, NULL, "Locator", loc);
 		if (!g) { // shouldn't happen
-			Eprintf("No record found for %lx\n", addr);
+			Eprintf("No record found for %Lx\n", addr);
 			return;
 		}
 		unsigned long val = inc_val(g, "corrected errors");
Index: mcelog-1.0~pre3-72-gcbd4da4/dimm.h
===================================================================
--- mcelog-1.0~pre3-72-gcbd4da4.orig/dimm.h	2011-07-20 18:44:28.521446547 +0200
+++ mcelog-1.0~pre3-72-gcbd4da4/dimm.h	2011-07-20 18:44:29.969434217 +0200
@@ -1,6 +1,6 @@
 void close_dimm_db(void);
 int open_dimm_db(char *fn);
-void new_error(unsigned long addr, unsigned long max_error, char *trigger);
+void new_error(unsigned long long addr, unsigned long max_error, char *trigger);
 void reset_dimm(char *locator);
 void gc_dimms(void);
 void dump_all_dimms(void);
Index: mcelog-1.0~pre3-72-gcbd4da4/dmi.c
===================================================================
--- mcelog-1.0~pre3-72-gcbd4da4.orig/dmi.c	2011-07-20 18:44:28.541446377 +0200
+++ mcelog-1.0~pre3-72-gcbd4da4/dmi.c	2011-07-20 18:44:29.989434047 +0200
@@ -331,7 +331,7 @@
 			Wprintf("%s ", type_details[i]);
 }
 
-static void dump_memdev(struct dmi_memdev *md, unsigned long addr)
+static void dump_memdev(struct dmi_memdev *md, unsigned long long addr)
 {
 	char tmp[20];
 	char unit[10];
@@ -340,7 +340,7 @@
 	if (md->header.length < 
 			offsetof(struct dmi_memdev, manufacturer)) { 
 		if (verbose > 0)
-			printf("Memory device for address %lx too short %u\n",
+			printf("Memory device for address %llx too short %u\n",
 			       addr, md->header.length);
 		return;
 	}	
@@ -532,7 +532,7 @@
 			DMIGET(dmi_dimms[i],device_set));
 }
 
-struct dmi_memdev **dmi_find_addr(unsigned long addr)
+struct dmi_memdev **dmi_find_addr(unsigned long long addr)
 {
 	struct dmi_memdev **devs; 
 	int i, k;
@@ -576,7 +576,7 @@
 	return devs;
 }
 
-void dmi_decodeaddr(unsigned long addr)
+void dmi_decodeaddr(unsigned long long addr)
 {
 	struct dmi_memdev **devs = dmi_find_addr(addr);
 	if (devs[0]) { 
@@ -585,7 +585,7 @@
 		for (i = 0; devs[i]; i++) 
 			dump_memdev(devs[i], addr);
 	} else { 
-		Wprintf("No DIMM found for %lx in SMBIOS\n", addr);
+		Wprintf("No DIMM found for %llx in SMBIOS\n", addr);
 	}
 	free(devs);
 } 
Index: mcelog-1.0~pre3-72-gcbd4da4/dmi.h
===================================================================
--- mcelog-1.0~pre3-72-gcbd4da4.orig/dmi.h	2011-07-20 18:44:28.561446205 +0200
+++ mcelog-1.0~pre3-72-gcbd4da4/dmi.h	2011-07-20 18:44:30.005433911 +0200
@@ -62,10 +62,10 @@
 }  __attribute__((packed));
 
 int opendmi(void);
-void dmi_decodeaddr(unsigned long addr);
+void dmi_decodeaddr(unsigned long long addr);
 int dmi_sanity_check(void);
 unsigned dmi_dimm_size(unsigned short size, char *unit);
-struct dmi_memdev **dmi_find_addr(unsigned long addr);
+struct dmi_memdev **dmi_find_addr(unsigned long long addr);
 void dmi_set_verbosity(int v);
 
 char *dmi_getstring(struct dmi_entry *e, unsigned number);
Index: mcelog-1.0~pre3-72-gcbd4da4/mcelog.c
===================================================================
--- mcelog-1.0~pre3-72-gcbd4da4.orig/mcelog.c	2011-07-20 18:44:28.581446035 +0200
+++ mcelog-1.0~pre3-72-gcbd4da4/mcelog.c	2011-07-20 18:44:30.021433775 +0200
@@ -127,7 +127,7 @@
 	}
 } 
 
-static void resolveaddr(unsigned long addr)
+static void resolveaddr(unsigned long long addr)
 {
 	if (addr && do_dmi && dmi_forced)
 		dmi_decodeaddr(addr);