aboutsummaryrefslogtreecommitdiffstats
path: root/package/utils/lua/patches/020-shared_liblua.patch
blob: bcd410f690b55109c9857cfc917448dd7ad6a473 (plain)
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
131
132
133
134
135
136
137
138
139
140
--- a/Makefile
+++ b/Makefile
@@ -42,8 +42,8 @@ PLATS= aix ansi bsd freebsd generic linu
 
 # What to install.
 TO_BIN= lua luac
-TO_INC= lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp
-TO_LIB= liblua.a
+TO_INC= lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp lnum_config.h
+TO_LIB= liblua.a liblua.so.$R
 TO_MAN= lua.1 luac.1
 
 # Lua version and release.
@@ -63,6 +63,7 @@ install: dummy
 	cd src && $(INSTALL_EXEC) $(TO_BIN) $(INSTALL_BIN)
 	cd src && $(INSTALL_DATA) $(TO_INC) $(INSTALL_INC)
 	cd src && $(INSTALL_DATA) $(TO_LIB) $(INSTALL_LIB)
+	ln -s liblua.so.$R $(INSTALL_LIB)/liblua.so
 	cd doc && $(INSTALL_DATA) $(TO_MAN) $(INSTALL_MAN)
 
 ranlib:
--- a/src/ldo.h
+++ b/src/ldo.h
@@ -46,7 +46,7 @@ LUAI_FUNC int luaD_pcall (lua_State *L, 
 LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult);
 LUAI_FUNC void luaD_reallocCI (lua_State *L, int newsize);
 LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize);
-LUAI_FUNC void luaD_growstack (lua_State *L, int n);
+LUA_API void luaD_growstack (lua_State *L, int n);
 
 LUAI_FUNC void luaD_throw (lua_State *L, int errcode);
 LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud);
--- a/src/lfunc.h
+++ b/src/lfunc.h
@@ -18,7 +18,7 @@
                          cast(int, sizeof(TValue *)*((n)-1)))
 
 
-LUAI_FUNC Proto *luaF_newproto (lua_State *L);
+LUA_API Proto *luaF_newproto (lua_State *L);
 LUAI_FUNC Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e);
 LUAI_FUNC Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e);
 LUAI_FUNC UpVal *luaF_newupval (lua_State *L);
--- a/src/lmem.h
+++ b/src/lmem.h
@@ -38,9 +38,9 @@
    ((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t))))
 
 
-LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize,
+LUA_API void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize,
                                                           size_t size);
-LUAI_FUNC void *luaM_toobig (lua_State *L);
+LUA_API void *luaM_toobig (lua_State *L);
 LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size,
                                size_t size_elem, int limit,
                                const char *errormsg);
--- a/src/lstring.h
+++ b/src/lstring.h
@@ -25,7 +25,7 @@
 
 LUAI_FUNC void luaS_resize (lua_State *L, int newsize);
 LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, Table *e);
-LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l);
+LUA_API TString *luaS_newlstr (lua_State *L, const char *str, size_t l);
 
 
 #endif
--- a/src/lundump.h
+++ b/src/lundump.h
@@ -17,7 +17,7 @@ LUAI_FUNC Proto* luaU_undump (lua_State*
 LUAI_FUNC void luaU_header (char* h);
 
 /* dump one chunk; from ldump.c */
-LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip);
+LUA_API int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip);
 
 #ifdef luac_c
 /* print one chunk; from print.c */
--- a/src/Makefile
+++ b/src/Makefile
@@ -23,6 +23,7 @@ MYLIBS=
 PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris
 
 LUA_A=	liblua.a
+LUA_SO= liblua.so
 CORE_O=	lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o \
 	lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o  \
 	lundump.o lvm.o lzio.o lnum.o
@@ -33,11 +34,12 @@ LUA_T=	lua
 LUA_O=	lua.o
 
 LUAC_T=	luac
-LUAC_O=	luac.o print.o
+LUAC_O=	luac.o print.o lopcodes.o
 
 ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O)
-ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)
+ALL_T= $(LUA_A) $(LUA_SO) $(LUA_T) $(LUAC_T)
 ALL_A= $(LUA_A)
+ALL_SO= $(LUA_SO)
 
 default: $(PLAT)
 
@@ -47,14 +49,23 @@ o:	$(ALL_O)
 
 a:	$(ALL_A)
 
+so:	$(ALL_SO)
+
 $(LUA_A): $(CORE_O) $(LIB_O)
 	$(AR) $@ $(CORE_O) $(LIB_O)	# DLL needs all object files
 	$(RANLIB) $@
 
-$(LUA_T): $(LUA_O) $(LUA_A)
-	$(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)
+$(LUA_SO): $(CORE_O) $(LIB_O)
+	$(CC) -o $@.$(PKG_VERSION) -shared -Wl,-soname="$@.$(PKG_VERSION)" $?
+	ln -fs $@.$(PKG_VERSION) $@
+
+$(LUA_T): $(LUA_O) $(LUA_SO)
+	$(CC) -o $@ -L. -llua $(MYLDFLAGS) $(LUA_O) $(LIBS)
+
+$(LUAC_T): $(LUAC_O) $(LUA_SO)
+	$(CC) -o $@ -L. -llua $(MYLDFLAGS) $(LUAC_O) $(LIBS)
 
-$(LUAC_T): $(LUAC_O) $(LUA_A)
+$(LUAC_T)-host: $(LUAC_O) $(LUA_A)
 	$(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)
 
 clean:
@@ -96,7 +107,7 @@ generic:
 	$(MAKE) all MYCFLAGS=
 
 linux:
-	$(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"
+	$(MAKE) all MYCFLAGS+=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"
 
 macosx:
 	$(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-lreadline"
are Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307 USA. * * Yaozu Dong (Eddie Dong) (Eddie.dong@intel.com) * Kun Tian (Kevin Tian) (Kevin.tian@intel.com) */ #include <linux/sched.h> #include <asm/tlb.h> #include <asm/vmx_mm_def.h> #include <asm/gcc_intrin.h> #include <xen/interrupt.h> #include <asm/vmx_vcpu.h> struct mmio_list *lookup_mmio(u64 gpa, struct mmio_list *mio_base) { int i; for (i=0; mio_base[i].iot != NOT_IO; i++ ) { if ( gpa >= mio_base[i].start && gpa <= mio_base[i].end ) return &mio_base[i]; } return NULL; } extern void pib_write(VCPU *vcpu, void *src, uint64_t pib_off, size_t s, int ma); static inline void mmio_write(VCPU *vcpu, void *src, u64 dest_pa, size_t s, int ma) { struct virutal_platform_def *v_plat; struct mmio_list *mio; v_plat = vmx_vcpu_get_plat(vcpu); mio = lookup_mmio(dest_pa, v_plat->mmio); if ( mio == NULL ) panic ("Wrong address for MMIO\n"); switch (mio->iot) { case PIB_MMIO: pib_write(vcpu, src, dest_pa - v_plat->pib_base, s, ma); break; case VGA_BUFF: case CHIPSET_IO: case LOW_MMIO: case LEGACY_IO: case IO_SAPIC: default: break; } return; } static inline void mmio_read(VCPU *vcpu, u64 src_pa, void *dest, size_t s, int ma) { struct virutal_platform_def *v_plat; struct mmio_list *mio; v_plat = vmx_vcpu_get_plat(vcpu); mio = lookup_mmio(src_pa, v_plat->mmio); if ( mio == NULL ) panic ("Wrong address for MMIO\n"); switch (mio->iot) { case PIB_MMIO: pib_read(vcpu, src_pa - v_plat->pib_base, dest, s, ma); break; case VGA_BUFF: case CHIPSET_IO: case LOW_MMIO: case LEGACY_IO: case IO_SAPIC: default: break; } return; } /* * Read or write data in guest virtual address mode. */ void memwrite_v(VCPU *vcpu, thash_data_t *vtlb, void *src, void *dest, size_t s) { uint64_t pa; if (!vtlb->nomap) panic("Normal memory write shouldn't go to this point!"); pa = PPN_2_PA(vtlb->ppn); pa += POFFSET((u64)dest, vtlb->ps); mmio_write (vcpu, src, pa, s, vtlb->ma); } void memwrite_p(VCPU *vcpu, void *src, void *dest, size_t s) { uint64_t pa = (uint64_t)dest; int ma; if ( pa & (1UL <<63) ) { // UC ma = 4; pa <<=1; pa >>=1; } else { // WBL ma = 0; // using WB for WBL } mmio_write (vcpu, src, pa, s, ma); } void memread_v(VCPU *vcpu, thash_data_t *vtlb, void *src, void *dest, size_t s) { uint64_t pa; if (!vtlb->nomap) panic("Normal memory write shouldn't go to this point!"); pa = PPN_2_PA(vtlb->ppn); pa += POFFSET((u64)src, vtlb->ps); mmio_read(vcpu, pa, dest, s, vtlb->ma); } void memread_p(VCPU *vcpu, void *src, void *dest, size_t s) { uint64_t pa = (uint64_t)src; int ma; if ( pa & (1UL <<63) ) { // UC ma = 4; pa <<=1; pa >>=1; } else { // WBL ma = 0; // using WB for WBL } mmio_read(vcpu, pa, dest, s, ma); } #define PIB_LOW_HALF(ofst) !(ofst&(1<<20)) #define PIB_OFST_INTA 0x1E0000 #define PIB_OFST_XTP 0x1E0008 /* * Deliver IPI message. (Only U-VP is supported now) * offset: address offset to IPI space. * value: deliver value. */ static void deliver_ipi (VCPU *vcpu, uint64_t dm, uint64_t vector) { #ifdef IPI_DEBUG printf ("deliver_ipi %lx %lx\n",dm,vector); #endif switch ( dm ) { case 0: // INT vmx_vcpu_pend_interrupt (vcpu, vector); break; case 2: // PMI // TODO -- inject guest PMI panic ("Inject guest PMI!\n"); break; case 4: // NMI vmx_vcpu_pend_interrupt (vcpu, 2); break; case 5: // INIT // TODO -- inject guest INIT panic ("Inject guest INIT!\n"); break; case 7: // ExtINT vmx_vcpu_pend_interrupt (vcpu, 0); break; case 1: case 3: case 6: default: panic ("Deliver reserved IPI!\n"); break; } } /* * TODO: Use hash table for the lookup. */ static inline VCPU *lid_2_vcpu (struct domain *d, u64 id, u64 eid) { int i; VCPU *vcpu; LID lid; for (i=0; i<MAX_VIRT_CPUS; i++) { vcpu = d->exec_domain[i]; lid.val = VPD_CR(vcpu, lid); if ( lid.id == id && lid.eid == eid ) { return vcpu; } } return NULL; } /* * execute write IPI op. */ static int write_ipi (VCPU *vcpu, uint64_t addr, uint64_t value) { VCPU *target_cpu; target_cpu = lid_2_vcpu(vcpu->domain, ((ipi_a_t)addr).id, ((ipi_a_t)addr).eid); if ( target_cpu == NULL ) panic("Unknown IPI cpu\n"); if ( target_cpu == vcpu ) { // IPI to self deliver_ipi (vcpu, ((ipi_d_t)value).dm, ((ipi_d_t)value).vector); return 1; } else { // TODO: send Host IPI to inject guest SMP IPI interruption panic ("No SM-VP supported!\n"); return 0; } } void pib_write(VCPU *vcpu, void *src, uint64_t pib_off, size_t s, int ma) { switch (pib_off) { case PIB_OFST_INTA: panic("Undefined write on PIB INTA\n"); break; case PIB_OFST_XTP: if ( s == 1 && ma == 4 /* UC */) { vmx_vcpu_get_plat(vcpu)->xtp = *(uint8_t *)src; } else { panic("Undefined write on PIB XTP\n"); } break; default: if ( PIB_LOW_HALF(pib_off) ) { // lower half if ( s != 8 || ma != 0x4 /* UC */ ) { panic("Undefined IPI-LHF write!\n"); } else { write_ipi(vcpu, pib_off, *(uint64_t *)src); // TODO for SM-VP } } else { // upper half printf("IPI-UHF write %lx\n",pib_off); panic("Not support yet for SM-VP\n"); } break; } } void pib_read(VCPU *vcpu, uint64_t pib_off, void *dest, size_t s, int ma) { switch (pib_off) { case PIB_OFST_INTA: // todo --- emit on processor system bus. if ( s == 1 && ma == 4) { // 1 byte load // TODO: INTA read from IOSAPIC } else { panic("Undefined read on PIB INTA\n"); } break; case PIB_OFST_XTP: if ( s == 1 && ma == 4) { *((uint8_t*)dest) = vmx_vcpu_get_plat(vcpu)->xtp; } else { panic("Undefined read on PIB XTP\n"); } break; default: if ( PIB_LOW_HALF(pib_off) ) { // lower half if ( s != 8 || ma != 4 ) { panic("Undefined IPI-LHF read!\n"); } else { #ifdef IPI_DEBUG printf("IPI-LHF read %lx\n",pib_off); #endif *(uint64_t *)dest = 0; // TODO for SM-VP } } else { // upper half if ( s != 1 || ma != 4 ) { panic("Undefined PIB-UHF read!\n"); } else { #ifdef IPI_DEBUG printf("IPI-UHF read %lx\n",pib_off); #endif *(uint8_t *)dest = 0; // TODO for SM-VP } } break; } }