1*4882a593SmuzhiyunUpstream-Statue: Pending 2*4882a593Smuzhiyun[from ftp://195.220.108.108/linux/fedora/linux/development/rawhide/source/SRPMS/l/libx86-1.1-21.fc23.src.rpm] 3*4882a593Smuzhiyun 4*4882a593Smuzhiyundiff -ur libx86-1.1/lrmi.c libx86-1.1.hack/lrmi.c 5*4882a593Smuzhiyun--- libx86-1.1/lrmi.c 2006-10-30 15:10:16.000000000 -0500 6*4882a593Smuzhiyun+++ libx86-1.1.hack/lrmi.c 2009-10-26 15:55:42.000000000 -0400 7*4882a593Smuzhiyun@@ -136,7 +136,7 @@ 8*4882a593Smuzhiyun if (context.ready) 9*4882a593Smuzhiyun return 1; 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun- if (!LRMI_common_init()) 12*4882a593Smuzhiyun+ if (!LRMI_common_init(0)) 13*4882a593Smuzhiyun return 0; 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* 16*4882a593Smuzhiyundiff -ur libx86-1.1/thunk.c libx86-1.1.hack/thunk.c 17*4882a593Smuzhiyun--- libx86-1.1/thunk.c 2008-04-02 20:48:00.000000000 -0400 18*4882a593Smuzhiyun+++ libx86-1.1.hack/thunk.c 2009-10-26 16:05:39.000000000 -0400 19*4882a593Smuzhiyun@@ -139,11 +139,11 @@ 20*4882a593Smuzhiyun int i; 21*4882a593Smuzhiyun X86EMU_intrFuncs intFuncs[256]; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun- if (!LRMI_common_init()) 24*4882a593Smuzhiyun+ mmap_addr = LRMI_common_init(1); 25*4882a593Smuzhiyun+ 26*4882a593Smuzhiyun+ if (!mmap_addr) 27*4882a593Smuzhiyun return 0; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun- mmap_addr = 0; 30*4882a593Smuzhiyun- 31*4882a593Smuzhiyun X86EMU_pioFuncs pioFuncs = { 32*4882a593Smuzhiyun (&x_inb), 33*4882a593Smuzhiyun (&x_inw), 34*4882a593Smuzhiyun@@ -169,10 +169,10 @@ 35*4882a593Smuzhiyun X86_ESP = 0xFFF9; 36*4882a593Smuzhiyun memset (stack, 0, 64*1024); 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun- *((char *)0) = 0x4f; /* Make sure that we end up jumping back to a 39*4882a593Smuzhiyun- halt instruction */ 40*4882a593Smuzhiyun+ *mmap_addr = 0x4f; /* Make sure that we end up jumping back to a 41*4882a593Smuzhiyun+ halt instruction */ 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun- M.mem_base = 0; 44*4882a593Smuzhiyun+ M.mem_base = (unsigned long)mmap_addr; 45*4882a593Smuzhiyun M.mem_size = 1024*1024; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun return 1; 48*4882a593Smuzhiyundiff -ur libx86-1.1/x86-common.c libx86-1.1.hack/x86-common.c 49*4882a593Smuzhiyun--- libx86-1.1/x86-common.c 2008-05-16 12:56:23.000000000 -0400 50*4882a593Smuzhiyun+++ libx86-1.1.hack/x86-common.c 2009-10-26 16:03:21.000000000 -0400 51*4882a593Smuzhiyun@@ -45,14 +45,15 @@ 52*4882a593Smuzhiyun static struct { 53*4882a593Smuzhiyun int ready; 54*4882a593Smuzhiyun int count; 55*4882a593Smuzhiyun+ void *offset; 56*4882a593Smuzhiyun struct mem_block blocks[REAL_MEM_BLOCKS]; 57*4882a593Smuzhiyun } mem_info = { 0 }; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun static int 60*4882a593Smuzhiyun-real_mem_init(void) 61*4882a593Smuzhiyun+real_mem_init(int high_page) 62*4882a593Smuzhiyun { 63*4882a593Smuzhiyun void *m; 64*4882a593Smuzhiyun- int fd_zero; 65*4882a593Smuzhiyun+ int fd_zero, flags = MAP_SHARED; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun if (mem_info.ready) 68*4882a593Smuzhiyun return 1; 69*4882a593Smuzhiyun@@ -63,9 +64,12 @@ 70*4882a593Smuzhiyun return 0; 71*4882a593Smuzhiyun } 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun+ if (!high_page) 74*4882a593Smuzhiyun+ flags |= MAP_FIXED; 75*4882a593Smuzhiyun+ 76*4882a593Smuzhiyun m = mmap((void *)REAL_MEM_BASE, REAL_MEM_SIZE, 77*4882a593Smuzhiyun- PROT_READ | PROT_WRITE | PROT_EXEC, 78*4882a593Smuzhiyun- MAP_FIXED | MAP_SHARED, fd_zero, 0); 79*4882a593Smuzhiyun+ PROT_READ | PROT_WRITE | PROT_EXEC, 80*4882a593Smuzhiyun+ flags, fd_zero, 0); 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun if (m == (void *)-1) { 83*4882a593Smuzhiyun perror("mmap /dev/zero"); 84*4882a593Smuzhiyun@@ -76,6 +80,7 @@ 85*4882a593Smuzhiyun close(fd_zero); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun mem_info.ready = 1; 88*4882a593Smuzhiyun+ mem_info.offset = m; 89*4882a593Smuzhiyun mem_info.count = 1; 90*4882a593Smuzhiyun mem_info.blocks[0].size = REAL_MEM_SIZE; 91*4882a593Smuzhiyun mem_info.blocks[0].free = 1; 92*4882a593Smuzhiyun@@ -87,7 +92,7 @@ 93*4882a593Smuzhiyun real_mem_deinit(void) 94*4882a593Smuzhiyun { 95*4882a593Smuzhiyun if (mem_info.ready) { 96*4882a593Smuzhiyun- munmap((void *)REAL_MEM_BASE, REAL_MEM_SIZE); 97*4882a593Smuzhiyun+ munmap(mem_info.offset, REAL_MEM_SIZE); 98*4882a593Smuzhiyun mem_info.ready = 0; 99*4882a593Smuzhiyun } 100*4882a593Smuzhiyun } 101*4882a593Smuzhiyun@@ -119,7 +124,7 @@ 102*4882a593Smuzhiyun LRMI_alloc_real(int size) 103*4882a593Smuzhiyun { 104*4882a593Smuzhiyun int i; 105*4882a593Smuzhiyun- char *r = (char *)REAL_MEM_BASE; 106*4882a593Smuzhiyun+ char *r = (char *)mem_info.offset; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun if (!mem_info.ready) 109*4882a593Smuzhiyun return NULL; 110*4882a593Smuzhiyun@@ -151,7 +156,7 @@ 111*4882a593Smuzhiyun LRMI_free_real(void *m) 112*4882a593Smuzhiyun { 113*4882a593Smuzhiyun int i; 114*4882a593Smuzhiyun- char *r = (char *)REAL_MEM_BASE; 115*4882a593Smuzhiyun+ char *r = (char *)mem_info.offset; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun if (!mem_info.ready) 118*4882a593Smuzhiyun return; 119*4882a593Smuzhiyun@@ -200,13 +205,15 @@ 120*4882a593Smuzhiyun return *(unsigned short *)(i * 4); 121*4882a593Smuzhiyun } 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun-int LRMI_common_init(void) 124*4882a593Smuzhiyun+void *LRMI_common_init(int high_page) 125*4882a593Smuzhiyun { 126*4882a593Smuzhiyun- void *m; 127*4882a593Smuzhiyun+ void *m, *offset; 128*4882a593Smuzhiyun int fd_mem; 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun- if (!real_mem_init()) 131*4882a593Smuzhiyun- return 0; 132*4882a593Smuzhiyun+ if (!real_mem_init(high_page)) 133*4882a593Smuzhiyun+ return NULL; 134*4882a593Smuzhiyun+ 135*4882a593Smuzhiyun+ offset = mem_info.offset - REAL_MEM_BASE; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /* 138*4882a593Smuzhiyun Map the Interrupt Vectors (0x0 - 0x400) + BIOS data (0x400 - 0x502) 139*4882a593Smuzhiyun@@ -217,33 +224,33 @@ 140*4882a593Smuzhiyun if (fd_mem == -1) { 141*4882a593Smuzhiyun real_mem_deinit(); 142*4882a593Smuzhiyun perror("open /dev/mem"); 143*4882a593Smuzhiyun- return 0; 144*4882a593Smuzhiyun+ return NULL; 145*4882a593Smuzhiyun } 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun- m = mmap((void *)0, 0x502, 148*4882a593Smuzhiyun- PROT_READ | PROT_WRITE | PROT_EXEC, 149*4882a593Smuzhiyun- MAP_FIXED | MAP_SHARED, fd_mem, 0); 150*4882a593Smuzhiyun+ m = mmap(offset, 0x502, 151*4882a593Smuzhiyun+ PROT_READ | PROT_WRITE | PROT_EXEC, 152*4882a593Smuzhiyun+ MAP_FIXED | MAP_SHARED, fd_mem, 0); 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun if (m == (void *)-1) { 155*4882a593Smuzhiyun close(fd_mem); 156*4882a593Smuzhiyun real_mem_deinit(); 157*4882a593Smuzhiyun perror("mmap /dev/mem"); 158*4882a593Smuzhiyun- return 0; 159*4882a593Smuzhiyun+ return NULL; 160*4882a593Smuzhiyun } 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun- m = mmap((void *)0xa0000, 0x100000 - 0xa0000, 163*4882a593Smuzhiyun+ m = mmap(offset+0xa0000, 0x100000 - 0xa0000, 164*4882a593Smuzhiyun PROT_READ | PROT_WRITE | PROT_EXEC, 165*4882a593Smuzhiyun MAP_FIXED | MAP_SHARED, fd_mem, 0xa0000); 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun if (m == (void *)-1) { 168*4882a593Smuzhiyun- munmap((void *)0, 0x502); 169*4882a593Smuzhiyun+ munmap(offset, 0x502); 170*4882a593Smuzhiyun close(fd_mem); 171*4882a593Smuzhiyun real_mem_deinit(); 172*4882a593Smuzhiyun perror("mmap /dev/mem"); 173*4882a593Smuzhiyun- return 0; 174*4882a593Smuzhiyun+ return NULL; 175*4882a593Smuzhiyun } 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun close(fd_mem); 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun- return 1; 180*4882a593Smuzhiyun+ return offset; 181*4882a593Smuzhiyun } 182*4882a593Smuzhiyundiff -ur libx86-1.1/x86-common.h libx86-1.1.hack/x86-common.h 183*4882a593Smuzhiyun--- libx86-1.1/x86-common.h 2006-09-07 18:44:27.000000000 -0400 184*4882a593Smuzhiyun+++ libx86-1.1.hack/x86-common.h 2009-10-26 16:01:19.000000000 -0400 185*4882a593Smuzhiyun@@ -40,4 +40,4 @@ 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun void *LRMI_alloc_real(int size); 188*4882a593Smuzhiyun void LRMI_free_real(void *m); 189*4882a593Smuzhiyun-int LRMI_common_init(void); 190*4882a593Smuzhiyun+void *LRMI_common_init(int high_page); 191