ia32_signal.c 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034
  1. /*
  2. * IA32 Architecture-specific signal handling support.
  3. *
  4. * Copyright (C) 1999, 2001-2002, 2005 Hewlett-Packard Co
  5. * David Mosberger-Tang <davidm@hpl.hp.com>
  6. * Copyright (C) 1999 Arun Sharma <arun.sharma@intel.com>
  7. * Copyright (C) 2000 VA Linux Co
  8. * Copyright (C) 2000 Don Dugger <n0ano@valinux.com>
  9. *
  10. * Derived from i386 and Alpha versions.
  11. */
  12. #include <linux/errno.h>
  13. #include <linux/kernel.h>
  14. #include <linux/mm.h>
  15. #include <linux/personality.h>
  16. #include <linux/ptrace.h>
  17. #include <linux/sched.h>
  18. #include <linux/signal.h>
  19. #include <linux/smp.h>
  20. #include <linux/smp_lock.h>
  21. #include <linux/stddef.h>
  22. #include <linux/syscalls.h>
  23. #include <linux/unistd.h>
  24. #include <linux/wait.h>
  25. #include <linux/compat.h>
  26. #include <asm/intrinsics.h>
  27. #include <asm/uaccess.h>
  28. #include <asm/rse.h>
  29. #include <asm/sigcontext.h>
  30. #include "ia32priv.h"
  31. #include "../kernel/sigframe.h"
  32. #define A(__x) ((unsigned long)(__x))
  33. #define DEBUG_SIG 0
  34. #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  35. #define __IA32_NR_sigreturn 119
  36. #define __IA32_NR_rt_sigreturn 173
  37. struct sigframe_ia32
  38. {
  39. int pretcode;
  40. int sig;
  41. struct sigcontext_ia32 sc;
  42. struct _fpstate_ia32 fpstate;
  43. unsigned int extramask[_COMPAT_NSIG_WORDS-1];
  44. char retcode[8];
  45. };
  46. struct rt_sigframe_ia32
  47. {
  48. int pretcode;
  49. int sig;
  50. int pinfo;
  51. int puc;
  52. compat_siginfo_t info;
  53. struct ucontext_ia32 uc;
  54. struct _fpstate_ia32 fpstate;
  55. char retcode[8];
  56. };
  57. int
  58. copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from)
  59. {
  60. unsigned long tmp;
  61. int err;
  62. if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t)))
  63. return -EFAULT;
  64. err = __get_user(to->si_signo, &from->si_signo);
  65. err |= __get_user(to->si_errno, &from->si_errno);
  66. err |= __get_user(to->si_code, &from->si_code);
  67. if (to->si_code < 0)
  68. err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
  69. else {
  70. switch (to->si_code >> 16) {
  71. case __SI_CHLD >> 16:
  72. err |= __get_user(to->si_utime, &from->si_utime);
  73. err |= __get_user(to->si_stime, &from->si_stime);
  74. err |= __get_user(to->si_status, &from->si_status);
  75. default:
  76. err |= __get_user(to->si_pid, &from->si_pid);
  77. err |= __get_user(to->si_uid, &from->si_uid);
  78. break;
  79. case __SI_FAULT >> 16:
  80. err |= __get_user(tmp, &from->si_addr);
  81. to->si_addr = (void __user *) tmp;
  82. break;
  83. case __SI_POLL >> 16:
  84. err |= __get_user(to->si_band, &from->si_band);
  85. err |= __get_user(to->si_fd, &from->si_fd);
  86. break;
  87. case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
  88. case __SI_MESGQ >> 16:
  89. err |= __get_user(to->si_pid, &from->si_pid);
  90. err |= __get_user(to->si_uid, &from->si_uid);
  91. err |= __get_user(to->si_int, &from->si_int);
  92. break;
  93. }
  94. }
  95. return err;
  96. }
  97. int
  98. copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from)
  99. {
  100. unsigned int addr;
  101. int err;
  102. if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
  103. return -EFAULT;
  104. /* If you change siginfo_t structure, please be sure
  105. this code is fixed accordingly.
  106. It should never copy any pad contained in the structure
  107. to avoid security leaks, but must copy the generic
  108. 3 ints plus the relevant union member.
  109. This routine must convert siginfo from 64bit to 32bit as well
  110. at the same time. */
  111. err = __put_user(from->si_signo, &to->si_signo);
  112. err |= __put_user(from->si_errno, &to->si_errno);
  113. err |= __put_user((short)from->si_code, &to->si_code);
  114. if (from->si_code < 0)
  115. err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
  116. else {
  117. switch (from->si_code >> 16) {
  118. case __SI_CHLD >> 16:
  119. err |= __put_user(from->si_utime, &to->si_utime);
  120. err |= __put_user(from->si_stime, &to->si_stime);
  121. err |= __put_user(from->si_status, &to->si_status);
  122. default:
  123. err |= __put_user(from->si_pid, &to->si_pid);
  124. err |= __put_user(from->si_uid, &to->si_uid);
  125. break;
  126. case __SI_FAULT >> 16:
  127. /* avoid type-checking warnings by copying _pad[0] in lieu of si_addr... */
  128. err |= __put_user(from->_sifields._pad[0], &to->si_addr);
  129. break;
  130. case __SI_POLL >> 16:
  131. err |= __put_user(from->si_band, &to->si_band);
  132. err |= __put_user(from->si_fd, &to->si_fd);
  133. break;
  134. case __SI_TIMER >> 16:
  135. err |= __put_user(from->si_tid, &to->si_tid);
  136. err |= __put_user(from->si_overrun, &to->si_overrun);
  137. addr = (unsigned long) from->si_ptr;
  138. err |= __put_user(addr, &to->si_ptr);
  139. break;
  140. case __SI_RT >> 16: /* Not generated by the kernel as of now. */
  141. case __SI_MESGQ >> 16:
  142. err |= __put_user(from->si_uid, &to->si_uid);
  143. err |= __put_user(from->si_pid, &to->si_pid);
  144. addr = (unsigned long) from->si_ptr;
  145. err |= __put_user(addr, &to->si_ptr);
  146. break;
  147. }
  148. }
  149. return err;
  150. }
  151. /*
  152. * SAVE and RESTORE of ia32 fpstate info, from ia64 current state
  153. * Used in exception handler to pass the fpstate to the user, and restore
  154. * the fpstate while returning from the exception handler.
  155. *
  156. * fpstate info and their mapping to IA64 regs:
  157. * fpstate REG(BITS) Attribute Comments
  158. * cw ar.fcr(0:12) with bits 7 and 6 not used
  159. * sw ar.fsr(0:15)
  160. * tag ar.fsr(16:31) with odd numbered bits not used
  161. * (read returns 0, writes ignored)
  162. * ipoff ar.fir(0:31)
  163. * cssel ar.fir(32:47)
  164. * dataoff ar.fdr(0:31)
  165. * datasel ar.fdr(32:47)
  166. *
  167. * _st[(0+TOS)%8] f8
  168. * _st[(1+TOS)%8] f9
  169. * _st[(2+TOS)%8] f10
  170. * _st[(3+TOS)%8] f11 (f8..f11 from ptregs)
  171. * : : : (f12..f15 from live reg)
  172. * : : :
  173. * _st[(7+TOS)%8] f15 TOS=sw.top(bits11:13)
  174. *
  175. * status Same as sw RO
  176. * magic 0 as X86_FXSR_MAGIC in ia32
  177. * mxcsr Bits(7:15)=ar.fcr(39:47)
  178. * Bits(0:5) =ar.fsr(32:37) with bit 6 reserved
  179. * _xmm[0..7] f16..f31 (live registers)
  180. * with _xmm[0]
  181. * Bit(64:127)=f17(0:63)
  182. * Bit(0:63)=f16(0:63)
  183. * All other fields unused...
  184. */
  185. static int
  186. save_ia32_fpstate_live (struct _fpstate_ia32 __user *save)
  187. {
  188. struct task_struct *tsk = current;
  189. struct pt_regs *ptp;
  190. struct _fpreg_ia32 *fpregp;
  191. char buf[32];
  192. unsigned long fsr, fcr, fir, fdr;
  193. unsigned long new_fsr;
  194. unsigned long num128[2];
  195. unsigned long mxcsr=0;
  196. int fp_tos, fr8_st_map;
  197. if (!access_ok(VERIFY_WRITE, save, sizeof(*save)))
  198. return -EFAULT;
  199. /* Read in fsr, fcr, fir, fdr and copy onto fpstate */
  200. fsr = ia64_getreg(_IA64_REG_AR_FSR);
  201. fcr = ia64_getreg(_IA64_REG_AR_FCR);
  202. fir = ia64_getreg(_IA64_REG_AR_FIR);
  203. fdr = ia64_getreg(_IA64_REG_AR_FDR);
  204. /*
  205. * We need to clear the exception state before calling the signal handler. Clear
  206. * the bits 15, bits 0-7 in fp status word. Similar to the functionality of fnclex
  207. * instruction.
  208. */
  209. new_fsr = fsr & ~0x80ff;
  210. ia64_setreg(_IA64_REG_AR_FSR, new_fsr);
  211. __put_user(fcr & 0xffff, &save->cw);
  212. __put_user(fsr & 0xffff, &save->sw);
  213. __put_user((fsr>>16) & 0xffff, &save->tag);
  214. __put_user(fir, &save->ipoff);
  215. __put_user((fir>>32) & 0xffff, &save->cssel);
  216. __put_user(fdr, &save->dataoff);
  217. __put_user((fdr>>32) & 0xffff, &save->datasel);
  218. __put_user(fsr & 0xffff, &save->status);
  219. mxcsr = ((fcr>>32) & 0xff80) | ((fsr>>32) & 0x3f);
  220. __put_user(mxcsr & 0xffff, &save->mxcsr);
  221. __put_user( 0, &save->magic); //#define X86_FXSR_MAGIC 0x0000
  222. /*
  223. * save f8..f11 from pt_regs
  224. * save f12..f15 from live register set
  225. */
  226. /*
  227. * Find the location where f8 has to go in fp reg stack. This depends on
  228. * TOP(11:13) field of sw. Other f reg continue sequentially from where f8 maps
  229. * to.
  230. */
  231. fp_tos = (fsr>>11)&0x7;
  232. fr8_st_map = (8-fp_tos)&0x7;
  233. ptp = ia64_task_regs(tsk);
  234. fpregp = (struct _fpreg_ia32 *)(((unsigned long)buf + 15) & ~15);
  235. ia64f2ia32f(fpregp, &ptp->f8);
  236. copy_to_user(&save->_st[(0+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32));
  237. ia64f2ia32f(fpregp, &ptp->f9);
  238. copy_to_user(&save->_st[(1+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32));
  239. ia64f2ia32f(fpregp, &ptp->f10);
  240. copy_to_user(&save->_st[(2+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32));
  241. ia64f2ia32f(fpregp, &ptp->f11);
  242. copy_to_user(&save->_st[(3+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32));
  243. ia64_stfe(fpregp, 12);
  244. copy_to_user(&save->_st[(4+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32));
  245. ia64_stfe(fpregp, 13);
  246. copy_to_user(&save->_st[(5+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32));
  247. ia64_stfe(fpregp, 14);
  248. copy_to_user(&save->_st[(6+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32));
  249. ia64_stfe(fpregp, 15);
  250. copy_to_user(&save->_st[(7+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32));
  251. ia64_stf8(&num128[0], 16);
  252. ia64_stf8(&num128[1], 17);
  253. copy_to_user(&save->_xmm[0], num128, sizeof(struct _xmmreg_ia32));
  254. ia64_stf8(&num128[0], 18);
  255. ia64_stf8(&num128[1], 19);
  256. copy_to_user(&save->_xmm[1], num128, sizeof(struct _xmmreg_ia32));
  257. ia64_stf8(&num128[0], 20);
  258. ia64_stf8(&num128[1], 21);
  259. copy_to_user(&save->_xmm[2], num128, sizeof(struct _xmmreg_ia32));
  260. ia64_stf8(&num128[0], 22);
  261. ia64_stf8(&num128[1], 23);
  262. copy_to_user(&save->_xmm[3], num128, sizeof(struct _xmmreg_ia32));
  263. ia64_stf8(&num128[0], 24);
  264. ia64_stf8(&num128[1], 25);
  265. copy_to_user(&save->_xmm[4], num128, sizeof(struct _xmmreg_ia32));
  266. ia64_stf8(&num128[0], 26);
  267. ia64_stf8(&num128[1], 27);
  268. copy_to_user(&save->_xmm[5], num128, sizeof(struct _xmmreg_ia32));
  269. ia64_stf8(&num128[0], 28);
  270. ia64_stf8(&num128[1], 29);
  271. copy_to_user(&save->_xmm[6], num128, sizeof(struct _xmmreg_ia32));
  272. ia64_stf8(&num128[0], 30);
  273. ia64_stf8(&num128[1], 31);
  274. copy_to_user(&save->_xmm[7], num128, sizeof(struct _xmmreg_ia32));
  275. return 0;
  276. }
  277. static int
  278. restore_ia32_fpstate_live (struct _fpstate_ia32 __user *save)
  279. {
  280. struct task_struct *tsk = current;
  281. struct pt_regs *ptp;
  282. unsigned int lo, hi;
  283. unsigned long num128[2];
  284. unsigned long num64, mxcsr;
  285. struct _fpreg_ia32 *fpregp;
  286. char buf[32];
  287. unsigned long fsr, fcr, fir, fdr;
  288. int fp_tos, fr8_st_map;
  289. if (!access_ok(VERIFY_READ, save, sizeof(*save)))
  290. return(-EFAULT);
  291. /*
  292. * Updating fsr, fcr, fir, fdr.
  293. * Just a bit more complicated than save.
  294. * - Need to make sure that we don't write any value other than the
  295. * specific fpstate info
  296. * - Need to make sure that the untouched part of frs, fdr, fir, fcr
  297. * should remain same while writing.
  298. * So, we do a read, change specific fields and write.
  299. */
  300. fsr = ia64_getreg(_IA64_REG_AR_FSR);
  301. fcr = ia64_getreg(_IA64_REG_AR_FCR);
  302. fir = ia64_getreg(_IA64_REG_AR_FIR);
  303. fdr = ia64_getreg(_IA64_REG_AR_FDR);
  304. __get_user(mxcsr, (unsigned int __user *)&save->mxcsr);
  305. /* setting bits 0..5 8..12 with cw and 39..47 from mxcsr */
  306. __get_user(lo, (unsigned int __user *)&save->cw);
  307. num64 = mxcsr & 0xff10;
  308. num64 = (num64 << 32) | (lo & 0x1f3f);
  309. fcr = (fcr & (~0xff1000001f3fUL)) | num64;
  310. /* setting bits 0..31 with sw and tag and 32..37 from mxcsr */
  311. __get_user(lo, (unsigned int __user *)&save->sw);
  312. /* set bits 15,7 (fsw.b, fsw.es) to reflect the current error status */
  313. if ( !(lo & 0x7f) )
  314. lo &= (~0x8080);
  315. __get_user(hi, (unsigned int __user *)&save->tag);
  316. num64 = mxcsr & 0x3f;
  317. num64 = (num64 << 16) | (hi & 0xffff);
  318. num64 = (num64 << 16) | (lo & 0xffff);
  319. fsr = (fsr & (~0x3fffffffffUL)) | num64;
  320. /* setting bits 0..47 with cssel and ipoff */
  321. __get_user(lo, (unsigned int __user *)&save->ipoff);
  322. __get_user(hi, (unsigned int __user *)&save->cssel);
  323. num64 = hi & 0xffff;
  324. num64 = (num64 << 32) | lo;
  325. fir = (fir & (~0xffffffffffffUL)) | num64;
  326. /* setting bits 0..47 with datasel and dataoff */
  327. __get_user(lo, (unsigned int __user *)&save->dataoff);
  328. __get_user(hi, (unsigned int __user *)&save->datasel);
  329. num64 = hi & 0xffff;
  330. num64 = (num64 << 32) | lo;
  331. fdr = (fdr & (~0xffffffffffffUL)) | num64;
  332. ia64_setreg(_IA64_REG_AR_FSR, fsr);
  333. ia64_setreg(_IA64_REG_AR_FCR, fcr);
  334. ia64_setreg(_IA64_REG_AR_FIR, fir);
  335. ia64_setreg(_IA64_REG_AR_FDR, fdr);
  336. /*
  337. * restore f8..f11 onto pt_regs
  338. * restore f12..f15 onto live registers
  339. */
  340. /*
  341. * Find the location where f8 has to go in fp reg stack. This depends on
  342. * TOP(11:13) field of sw. Other f reg continue sequentially from where f8 maps
  343. * to.
  344. */
  345. fp_tos = (fsr>>11)&0x7;
  346. fr8_st_map = (8-fp_tos)&0x7;
  347. fpregp = (struct _fpreg_ia32 *)(((unsigned long)buf + 15) & ~15);
  348. ptp = ia64_task_regs(tsk);
  349. copy_from_user(fpregp, &save->_st[(0+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32));
  350. ia32f2ia64f(&ptp->f8, fpregp);
  351. copy_from_user(fpregp, &save->_st[(1+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32));
  352. ia32f2ia64f(&ptp->f9, fpregp);
  353. copy_from_user(fpregp, &save->_st[(2+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32));
  354. ia32f2ia64f(&ptp->f10, fpregp);
  355. copy_from_user(fpregp, &save->_st[(3+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32));
  356. ia32f2ia64f(&ptp->f11, fpregp);
  357. copy_from_user(fpregp, &save->_st[(4+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32));
  358. ia64_ldfe(12, fpregp);
  359. copy_from_user(fpregp, &save->_st[(5+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32));
  360. ia64_ldfe(13, fpregp);
  361. copy_from_user(fpregp, &save->_st[(6+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32));
  362. ia64_ldfe(14, fpregp);
  363. copy_from_user(fpregp, &save->_st[(7+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32));
  364. ia64_ldfe(15, fpregp);
  365. copy_from_user(num128, &save->_xmm[0], sizeof(struct _xmmreg_ia32));
  366. ia64_ldf8(16, &num128[0]);
  367. ia64_ldf8(17, &num128[1]);
  368. copy_from_user(num128, &save->_xmm[1], sizeof(struct _xmmreg_ia32));
  369. ia64_ldf8(18, &num128[0]);
  370. ia64_ldf8(19, &num128[1]);
  371. copy_from_user(num128, &save->_xmm[2], sizeof(struct _xmmreg_ia32));
  372. ia64_ldf8(20, &num128[0]);
  373. ia64_ldf8(21, &num128[1]);
  374. copy_from_user(num128, &save->_xmm[3], sizeof(struct _xmmreg_ia32));
  375. ia64_ldf8(22, &num128[0]);
  376. ia64_ldf8(23, &num128[1]);
  377. copy_from_user(num128, &save->_xmm[4], sizeof(struct _xmmreg_ia32));
  378. ia64_ldf8(24, &num128[0]);
  379. ia64_ldf8(25, &num128[1]);
  380. copy_from_user(num128, &save->_xmm[5], sizeof(struct _xmmreg_ia32));
  381. ia64_ldf8(26, &num128[0]);
  382. ia64_ldf8(27, &num128[1]);
  383. copy_from_user(num128, &save->_xmm[6], sizeof(struct _xmmreg_ia32));
  384. ia64_ldf8(28, &num128[0]);
  385. ia64_ldf8(29, &num128[1]);
  386. copy_from_user(num128, &save->_xmm[7], sizeof(struct _xmmreg_ia32));
  387. ia64_ldf8(30, &num128[0]);
  388. ia64_ldf8(31, &num128[1]);
  389. return 0;
  390. }
  391. static inline void
  392. sigact_set_handler (struct k_sigaction *sa, unsigned int handler, unsigned int restorer)
  393. {
  394. if (handler + 1 <= 2)
  395. /* SIG_DFL, SIG_IGN, or SIG_ERR: must sign-extend to 64-bits */
  396. sa->sa.sa_handler = (__sighandler_t) A((int) handler);
  397. else
  398. sa->sa.sa_handler = (__sighandler_t) (((unsigned long) restorer << 32) | handler);
  399. }
  400. long
  401. __ia32_rt_sigsuspend (compat_sigset_t *sset, unsigned int sigsetsize, struct sigscratch *scr)
  402. {
  403. extern long ia64_do_signal (sigset_t *oldset, struct sigscratch *scr, long in_syscall);
  404. sigset_t oldset, set;
  405. scr->scratch_unat = 0; /* avoid leaking kernel bits to user level */
  406. memset(&set, 0, sizeof(set));
  407. memcpy(&set.sig, &sset->sig, sigsetsize);
  408. sigdelsetmask(&set, ~_BLOCKABLE);
  409. spin_lock_irq(&current->sighand->siglock);
  410. {
  411. oldset = current->blocked;
  412. current->blocked = set;
  413. recalc_sigpending();
  414. }
  415. spin_unlock_irq(&current->sighand->siglock);
  416. /*
  417. * The return below usually returns to the signal handler. We need to pre-set the
  418. * correct error code here to ensure that the right values get saved in sigcontext
  419. * by ia64_do_signal.
  420. */
  421. scr->pt.r8 = -EINTR;
  422. while (1) {
  423. current->state = TASK_INTERRUPTIBLE;
  424. schedule();
  425. if (ia64_do_signal(&oldset, scr, 1))
  426. return -EINTR;
  427. }
  428. }
  429. asmlinkage long
  430. ia32_rt_sigsuspend (compat_sigset_t __user *uset, unsigned int sigsetsize, struct sigscratch *scr)
  431. {
  432. compat_sigset_t set;
  433. if (sigsetsize > sizeof(compat_sigset_t))
  434. return -EINVAL;
  435. if (copy_from_user(&set.sig, &uset->sig, sigsetsize))
  436. return -EFAULT;
  437. return __ia32_rt_sigsuspend(&set, sigsetsize, scr);
  438. }
  439. asmlinkage long
  440. ia32_sigsuspend (unsigned int mask, struct sigscratch *scr)
  441. {
  442. return __ia32_rt_sigsuspend((compat_sigset_t *) &mask, sizeof(mask), scr);
  443. }
  444. asmlinkage long
  445. sys32_signal (int sig, unsigned int handler)
  446. {
  447. struct k_sigaction new_sa, old_sa;
  448. int ret;
  449. sigact_set_handler(&new_sa, handler, 0);
  450. new_sa.sa.sa_flags = SA_ONESHOT | SA_NOMASK;
  451. ret = do_sigaction(sig, &new_sa, &old_sa);
  452. return ret ? ret : IA32_SA_HANDLER(&old_sa);
  453. }
  454. asmlinkage long
  455. sys32_rt_sigaction (int sig, struct sigaction32 __user *act,
  456. struct sigaction32 __user *oact, unsigned int sigsetsize)
  457. {
  458. struct k_sigaction new_ka, old_ka;
  459. unsigned int handler, restorer;
  460. int ret;
  461. /* XXX: Don't preclude handling different sized sigset_t's. */
  462. if (sigsetsize != sizeof(compat_sigset_t))
  463. return -EINVAL;
  464. if (act) {
  465. ret = get_user(handler, &act->sa_handler);
  466. ret |= get_user(new_ka.sa.sa_flags, &act->sa_flags);
  467. ret |= get_user(restorer, &act->sa_restorer);
  468. ret |= copy_from_user(&new_ka.sa.sa_mask, &act->sa_mask, sizeof(compat_sigset_t));
  469. if (ret)
  470. return -EFAULT;
  471. sigact_set_handler(&new_ka, handler, restorer);
  472. }
  473. ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
  474. if (!ret && oact) {
  475. ret = put_user(IA32_SA_HANDLER(&old_ka), &oact->sa_handler);
  476. ret |= put_user(old_ka.sa.sa_flags, &oact->sa_flags);
  477. ret |= put_user(IA32_SA_RESTORER(&old_ka), &oact->sa_restorer);
  478. ret |= copy_to_user(&oact->sa_mask, &old_ka.sa.sa_mask, sizeof(compat_sigset_t));
  479. }
  480. return ret;
  481. }
  482. asmlinkage long
  483. sys32_rt_sigprocmask (int how, compat_sigset_t __user *set, compat_sigset_t __user *oset,
  484. unsigned int sigsetsize)
  485. {
  486. mm_segment_t old_fs = get_fs();
  487. sigset_t s;
  488. long ret;
  489. if (sigsetsize > sizeof(s))
  490. return -EINVAL;
  491. if (set) {
  492. memset(&s, 0, sizeof(s));
  493. if (copy_from_user(&s.sig, set, sigsetsize))
  494. return -EFAULT;
  495. }
  496. set_fs(KERNEL_DS);
  497. ret = sys_rt_sigprocmask(how,
  498. set ? (sigset_t __user *) &s : NULL,
  499. oset ? (sigset_t __user *) &s : NULL, sizeof(s));
  500. set_fs(old_fs);
  501. if (ret)
  502. return ret;
  503. if (oset) {
  504. if (copy_to_user(oset, &s.sig, sigsetsize))
  505. return -EFAULT;
  506. }
  507. return 0;
  508. }
  509. asmlinkage long
  510. sys32_rt_sigqueueinfo (int pid, int sig, compat_siginfo_t __user *uinfo)
  511. {
  512. mm_segment_t old_fs = get_fs();
  513. siginfo_t info;
  514. int ret;
  515. if (copy_siginfo_from_user32(&info, uinfo))
  516. return -EFAULT;
  517. set_fs(KERNEL_DS);
  518. ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *) &info);
  519. set_fs(old_fs);
  520. return ret;
  521. }
  522. asmlinkage long
  523. sys32_sigaction (int sig, struct old_sigaction32 __user *act, struct old_sigaction32 __user *oact)
  524. {
  525. struct k_sigaction new_ka, old_ka;
  526. unsigned int handler, restorer;
  527. int ret;
  528. if (act) {
  529. compat_old_sigset_t mask;
  530. ret = get_user(handler, &act->sa_handler);
  531. ret |= get_user(new_ka.sa.sa_flags, &act->sa_flags);
  532. ret |= get_user(restorer, &act->sa_restorer);
  533. ret |= get_user(mask, &act->sa_mask);
  534. if (ret)
  535. return ret;
  536. sigact_set_handler(&new_ka, handler, restorer);
  537. siginitset(&new_ka.sa.sa_mask, mask);
  538. }
  539. ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
  540. if (!ret && oact) {
  541. ret = put_user(IA32_SA_HANDLER(&old_ka), &oact->sa_handler);
  542. ret |= put_user(old_ka.sa.sa_flags, &oact->sa_flags);
  543. ret |= put_user(IA32_SA_RESTORER(&old_ka), &oact->sa_restorer);
  544. ret |= put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
  545. }
  546. return ret;
  547. }
  548. static int
  549. setup_sigcontext_ia32 (struct sigcontext_ia32 __user *sc, struct _fpstate_ia32 __user *fpstate,
  550. struct pt_regs *regs, unsigned long mask)
  551. {
  552. int err = 0;
  553. unsigned long flag;
  554. if (!access_ok(VERIFY_WRITE, sc, sizeof(*sc)))
  555. return -EFAULT;
  556. err |= __put_user((regs->r16 >> 32) & 0xffff, (unsigned int __user *)&sc->fs);
  557. err |= __put_user((regs->r16 >> 48) & 0xffff, (unsigned int __user *)&sc->gs);
  558. err |= __put_user((regs->r16 >> 16) & 0xffff, (unsigned int __user *)&sc->es);
  559. err |= __put_user(regs->r16 & 0xffff, (unsigned int __user *)&sc->ds);
  560. err |= __put_user(regs->r15, &sc->edi);
  561. err |= __put_user(regs->r14, &sc->esi);
  562. err |= __put_user(regs->r13, &sc->ebp);
  563. err |= __put_user(regs->r12, &sc->esp);
  564. err |= __put_user(regs->r11, &sc->ebx);
  565. err |= __put_user(regs->r10, &sc->edx);
  566. err |= __put_user(regs->r9, &sc->ecx);
  567. err |= __put_user(regs->r8, &sc->eax);
  568. #if 0
  569. err |= __put_user(current->tss.trap_no, &sc->trapno);
  570. err |= __put_user(current->tss.error_code, &sc->err);
  571. #endif
  572. err |= __put_user(regs->cr_iip, &sc->eip);
  573. err |= __put_user(regs->r17 & 0xffff, (unsigned int __user *)&sc->cs);
  574. /*
  575. * `eflags' is in an ar register for this context
  576. */
  577. flag = ia64_getreg(_IA64_REG_AR_EFLAG);
  578. err |= __put_user((unsigned int)flag, &sc->eflags);
  579. err |= __put_user(regs->r12, &sc->esp_at_signal);
  580. err |= __put_user((regs->r17 >> 16) & 0xffff, (unsigned int __user *)&sc->ss);
  581. if ( save_ia32_fpstate_live(fpstate) < 0 )
  582. err = -EFAULT;
  583. else
  584. err |= __put_user((u32)(u64)fpstate, &sc->fpstate);
  585. #if 0
  586. tmp = save_i387(fpstate);
  587. if (tmp < 0)
  588. err = 1;
  589. else
  590. err |= __put_user(tmp ? fpstate : NULL, &sc->fpstate);
  591. /* non-iBCS2 extensions.. */
  592. #endif
  593. err |= __put_user(mask, &sc->oldmask);
  594. #if 0
  595. err |= __put_user(current->tss.cr2, &sc->cr2);
  596. #endif
  597. return err;
  598. }
  599. static int
  600. restore_sigcontext_ia32 (struct pt_regs *regs, struct sigcontext_ia32 __user *sc, int *peax)
  601. {
  602. unsigned int err = 0;
  603. /* Always make any pending restarted system calls return -EINTR */
  604. current_thread_info()->restart_block.fn = do_no_restart_syscall;
  605. if (!access_ok(VERIFY_READ, sc, sizeof(*sc)))
  606. return(-EFAULT);
  607. #define COPY(ia64x, ia32x) err |= __get_user(regs->ia64x, &sc->ia32x)
  608. #define copyseg_gs(tmp) (regs->r16 |= (unsigned long) (tmp) << 48)
  609. #define copyseg_fs(tmp) (regs->r16 |= (unsigned long) (tmp) << 32)
  610. #define copyseg_cs(tmp) (regs->r17 |= tmp)
  611. #define copyseg_ss(tmp) (regs->r17 |= (unsigned long) (tmp) << 16)
  612. #define copyseg_es(tmp) (regs->r16 |= (unsigned long) (tmp) << 16)
  613. #define copyseg_ds(tmp) (regs->r16 |= tmp)
  614. #define COPY_SEG(seg) \
  615. { \
  616. unsigned short tmp; \
  617. err |= __get_user(tmp, &sc->seg); \
  618. copyseg_##seg(tmp); \
  619. }
  620. #define COPY_SEG_STRICT(seg) \
  621. { \
  622. unsigned short tmp; \
  623. err |= __get_user(tmp, &sc->seg); \
  624. copyseg_##seg(tmp|3); \
  625. }
  626. /* To make COPY_SEGs easier, we zero r16, r17 */
  627. regs->r16 = 0;
  628. regs->r17 = 0;
  629. COPY_SEG(gs);
  630. COPY_SEG(fs);
  631. COPY_SEG(es);
  632. COPY_SEG(ds);
  633. COPY(r15, edi);
  634. COPY(r14, esi);
  635. COPY(r13, ebp);
  636. COPY(r12, esp);
  637. COPY(r11, ebx);
  638. COPY(r10, edx);
  639. COPY(r9, ecx);
  640. COPY(cr_iip, eip);
  641. COPY_SEG_STRICT(cs);
  642. COPY_SEG_STRICT(ss);
  643. ia32_load_segment_descriptors(current);
  644. {
  645. unsigned int tmpflags;
  646. unsigned long flag;
  647. /*
  648. * IA32 `eflags' is not part of `pt_regs', it's in an ar register which
  649. * is part of the thread context. Fortunately, we are executing in the
  650. * IA32 process's context.
  651. */
  652. err |= __get_user(tmpflags, &sc->eflags);
  653. flag = ia64_getreg(_IA64_REG_AR_EFLAG);
  654. flag &= ~0x40DD5;
  655. flag |= (tmpflags & 0x40DD5);
  656. ia64_setreg(_IA64_REG_AR_EFLAG, flag);
  657. regs->r1 = -1; /* disable syscall checks, r1 is orig_eax */
  658. }
  659. {
  660. struct _fpstate_ia32 __user *buf = NULL;
  661. u32 fpstate_ptr;
  662. err |= get_user(fpstate_ptr, &(sc->fpstate));
  663. buf = compat_ptr(fpstate_ptr);
  664. if (buf) {
  665. err |= restore_ia32_fpstate_live(buf);
  666. }
  667. }
  668. #if 0
  669. {
  670. struct _fpstate * buf;
  671. err |= __get_user(buf, &sc->fpstate);
  672. if (buf) {
  673. if (!access_ok(VERIFY_READ, buf, sizeof(*buf)))
  674. goto badframe;
  675. err |= restore_i387(buf);
  676. }
  677. }
  678. #endif
  679. err |= __get_user(*peax, &sc->eax);
  680. return err;
  681. #if 0
  682. badframe:
  683. return 1;
  684. #endif
  685. }
  686. /*
  687. * Determine which stack to use..
  688. */
  689. static inline void __user *
  690. get_sigframe (struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
  691. {
  692. unsigned long esp;
  693. /* Default to using normal stack (truncate off sign-extension of bit 31: */
  694. esp = (unsigned int) regs->r12;
  695. /* This is the X/Open sanctioned signal stack switching. */
  696. if (ka->sa.sa_flags & SA_ONSTACK) {
  697. if (!on_sig_stack(esp))
  698. esp = current->sas_ss_sp + current->sas_ss_size;
  699. }
  700. /* Legacy stack switching not supported */
  701. return (void __user *)((esp - frame_size) & -8ul);
  702. }
  703. static int
  704. setup_frame_ia32 (int sig, struct k_sigaction *ka, sigset_t *set, struct pt_regs * regs)
  705. {
  706. struct exec_domain *ed = current_thread_info()->exec_domain;
  707. struct sigframe_ia32 __user *frame;
  708. int err = 0;
  709. frame = get_sigframe(ka, regs, sizeof(*frame));
  710. if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
  711. goto give_sigsegv;
  712. err |= __put_user((ed && ed->signal_invmap && sig < 32
  713. ? (int)(ed->signal_invmap[sig]) : sig), &frame->sig);
  714. err |= setup_sigcontext_ia32(&frame->sc, &frame->fpstate, regs, set->sig[0]);
  715. if (_COMPAT_NSIG_WORDS > 1)
  716. err |= __copy_to_user(frame->extramask, (char *) &set->sig + 4,
  717. sizeof(frame->extramask));
  718. /* Set up to return from userspace. If provided, use a stub
  719. already in userspace. */
  720. if (ka->sa.sa_flags & SA_RESTORER) {
  721. unsigned int restorer = IA32_SA_RESTORER(ka);
  722. err |= __put_user(restorer, &frame->pretcode);
  723. } else {
  724. /* Pointing to restorer in ia32 gate page */
  725. err |= __put_user(IA32_GATE_OFFSET, &frame->pretcode);
  726. }
  727. /* This is popl %eax ; movl $,%eax ; int $0x80
  728. * and there for historical reasons only.
  729. * See arch/i386/kernel/signal.c
  730. */
  731. err |= __put_user(0xb858, (short __user *)(frame->retcode+0));
  732. err |= __put_user(__IA32_NR_sigreturn, (int __user *)(frame->retcode+2));
  733. err |= __put_user(0x80cd, (short __user *)(frame->retcode+6));
  734. if (err)
  735. goto give_sigsegv;
  736. /* Set up registers for signal handler */
  737. regs->r12 = (unsigned long) frame;
  738. regs->cr_iip = IA32_SA_HANDLER(ka);
  739. set_fs(USER_DS);
  740. #if 0
  741. regs->eflags &= ~TF_MASK;
  742. #endif
  743. #if 0
  744. printk("SIG deliver (%s:%d): sig=%d sp=%p pc=%lx ra=%x\n",
  745. current->comm, current->pid, sig, (void *) frame, regs->cr_iip, frame->pretcode);
  746. #endif
  747. return 1;
  748. give_sigsegv:
  749. force_sigsegv(sig, current);
  750. return 0;
  751. }
  752. static int
  753. setup_rt_frame_ia32 (int sig, struct k_sigaction *ka, siginfo_t *info,
  754. sigset_t *set, struct pt_regs * regs)
  755. {
  756. struct exec_domain *ed = current_thread_info()->exec_domain;
  757. compat_uptr_t pinfo, puc;
  758. struct rt_sigframe_ia32 __user *frame;
  759. int err = 0;
  760. frame = get_sigframe(ka, regs, sizeof(*frame));
  761. if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
  762. goto give_sigsegv;
  763. err |= __put_user((ed && ed->signal_invmap
  764. && sig < 32 ? ed->signal_invmap[sig] : sig), &frame->sig);
  765. pinfo = (long __user) &frame->info;
  766. puc = (long __user) &frame->uc;
  767. err |= __put_user(pinfo, &frame->pinfo);
  768. err |= __put_user(puc, &frame->puc);
  769. err |= copy_siginfo_to_user32(&frame->info, info);
  770. /* Create the ucontext. */
  771. err |= __put_user(0, &frame->uc.uc_flags);
  772. err |= __put_user(0, &frame->uc.uc_link);
  773. err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
  774. err |= __put_user(sas_ss_flags(regs->r12), &frame->uc.uc_stack.ss_flags);
  775. err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
  776. err |= setup_sigcontext_ia32(&frame->uc.uc_mcontext, &frame->fpstate, regs, set->sig[0]);
  777. err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
  778. if (err)
  779. goto give_sigsegv;
  780. /* Set up to return from userspace. If provided, use a stub
  781. already in userspace. */
  782. if (ka->sa.sa_flags & SA_RESTORER) {
  783. unsigned int restorer = IA32_SA_RESTORER(ka);
  784. err |= __put_user(restorer, &frame->pretcode);
  785. } else {
  786. /* Pointing to rt_restorer in ia32 gate page */
  787. err |= __put_user(IA32_GATE_OFFSET + 8, &frame->pretcode);
  788. }
  789. /* This is movl $,%eax ; int $0x80
  790. * and there for historical reasons only.
  791. * See arch/i386/kernel/signal.c
  792. */
  793. err |= __put_user(0xb8, (char __user *)(frame->retcode+0));
  794. err |= __put_user(__IA32_NR_rt_sigreturn, (int __user *)(frame->retcode+1));
  795. err |= __put_user(0x80cd, (short __user *)(frame->retcode+5));
  796. if (err)
  797. goto give_sigsegv;
  798. /* Set up registers for signal handler */
  799. regs->r12 = (unsigned long) frame;
  800. regs->cr_iip = IA32_SA_HANDLER(ka);
  801. set_fs(USER_DS);
  802. #if 0
  803. regs->eflags &= ~TF_MASK;
  804. #endif
  805. #if 0
  806. printk("SIG deliver (%s:%d): sp=%p pc=%lx ra=%x\n",
  807. current->comm, current->pid, (void *) frame, regs->cr_iip, frame->pretcode);
  808. #endif
  809. return 1;
  810. give_sigsegv:
  811. force_sigsegv(sig, current);
  812. return 0;
  813. }
  814. int
  815. ia32_setup_frame1 (int sig, struct k_sigaction *ka, siginfo_t *info,
  816. sigset_t *set, struct pt_regs *regs)
  817. {
  818. /* Set up the stack frame */
  819. if (ka->sa.sa_flags & SA_SIGINFO)
  820. return setup_rt_frame_ia32(sig, ka, info, set, regs);
  821. else
  822. return setup_frame_ia32(sig, ka, set, regs);
  823. }
  824. asmlinkage long
  825. sys32_sigreturn (int arg0, int arg1, int arg2, int arg3, int arg4, int arg5,
  826. int arg6, int arg7, struct pt_regs regs)
  827. {
  828. unsigned long esp = (unsigned int) regs.r12;
  829. struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(esp - 8);
  830. sigset_t set;
  831. int eax;
  832. if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
  833. goto badframe;
  834. if (__get_user(set.sig[0], &frame->sc.oldmask)
  835. || (_COMPAT_NSIG_WORDS > 1 && __copy_from_user((char *) &set.sig + 4, &frame->extramask,
  836. sizeof(frame->extramask))))
  837. goto badframe;
  838. sigdelsetmask(&set, ~_BLOCKABLE);
  839. spin_lock_irq(&current->sighand->siglock);
  840. current->blocked = set;
  841. recalc_sigpending();
  842. spin_unlock_irq(&current->sighand->siglock);
  843. if (restore_sigcontext_ia32(&regs, &frame->sc, &eax))
  844. goto badframe;
  845. return eax;
  846. badframe:
  847. force_sig(SIGSEGV, current);
  848. return 0;
  849. }
  850. asmlinkage long
  851. sys32_rt_sigreturn (int arg0, int arg1, int arg2, int arg3, int arg4,
  852. int arg5, int arg6, int arg7, struct pt_regs regs)
  853. {
  854. unsigned long esp = (unsigned int) regs.r12;
  855. struct rt_sigframe_ia32 __user *frame = (struct rt_sigframe_ia32 __user *)(esp - 4);
  856. sigset_t set;
  857. int eax;
  858. if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
  859. goto badframe;
  860. if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
  861. goto badframe;
  862. sigdelsetmask(&set, ~_BLOCKABLE);
  863. spin_lock_irq(&current->sighand->siglock);
  864. current->blocked = set;
  865. recalc_sigpending();
  866. spin_unlock_irq(&current->sighand->siglock);
  867. if (restore_sigcontext_ia32(&regs, &frame->uc.uc_mcontext, &eax))
  868. goto badframe;
  869. /* It is more difficult to avoid calling this function than to
  870. call it and ignore errors. */
  871. do_sigaltstack((stack_t __user *) &frame->uc.uc_stack, NULL, esp);
  872. return eax;
  873. badframe:
  874. force_sig(SIGSEGV, current);
  875. return 0;
  876. }