Revision 388bb21a linux-user/signal.c
b/linux-user/signal.c | ||
---|---|---|
432 | 432 |
if (oact) { |
433 | 433 |
oact->_sa_handler = tswapl(k->sa._sa_handler); |
434 | 434 |
oact->sa_flags = tswapl(k->sa.sa_flags); |
435 |
#if !defined(TARGET_MIPS)
|
|
436 |
oact->sa_restorer = tswapl(k->sa.sa_restorer);
|
|
437 |
#endif
|
|
435 |
#if !defined(TARGET_MIPS) |
|
436 |
oact->sa_restorer = tswapl(k->sa.sa_restorer); |
|
437 |
#endif |
|
438 | 438 |
oact->sa_mask = k->sa.sa_mask; |
439 | 439 |
} |
440 | 440 |
if (act) { |
441 | 441 |
k->sa._sa_handler = tswapl(act->_sa_handler); |
442 | 442 |
k->sa.sa_flags = tswapl(act->sa_flags); |
443 |
#if !defined(TARGET_MIPS)
|
|
444 |
k->sa.sa_restorer = tswapl(act->sa_restorer);
|
|
445 |
#endif
|
|
443 |
#if !defined(TARGET_MIPS) |
|
444 |
k->sa.sa_restorer = tswapl(act->sa_restorer); |
|
445 |
#endif |
|
446 | 446 |
k->sa.sa_mask = act->sa_mask; |
447 | 447 |
|
448 | 448 |
/* we update the host linux signal state */ |
... | ... | |
1684 | 1684 |
|
1685 | 1685 |
err |= __put_user(regs->PC, &sc->sc_pc); |
1686 | 1686 |
|
1687 |
#define save_gp_reg(i) do { \
|
|
1688 |
err |= __put_user(regs->gpr[i], &sc->sc_regs[i]); \
|
|
1687 |
#define save_gp_reg(i) do { \ |
|
1688 |
err |= __put_user(regs->gpr[i], &sc->sc_regs[i]); \ |
|
1689 | 1689 |
} while(0) |
1690 | 1690 |
__put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2); |
1691 | 1691 |
save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6); |
... | ... | |
1696 | 1696 |
save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26); |
1697 | 1697 |
save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30); |
1698 | 1698 |
save_gp_reg(31); |
1699 |
#undef save_gp_reg
|
|
1699 |
#undef save_gp_reg |
|
1700 | 1700 |
|
1701 | 1701 |
err |= __put_user(regs->HI, &sc->sc_mdhi); |
1702 | 1702 |
err |= __put_user(regs->LO, &sc->sc_mdlo); |
... | ... | |
1713 | 1713 |
err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp); |
1714 | 1714 |
} |
1715 | 1715 |
/* same with 64 bit */ |
1716 |
#ifdef CONFIG_64BIT
|
|
1716 |
#ifdef CONFIG_64BIT |
|
1717 | 1717 |
err |= __put_user(regs->hi, &sc->sc_hi[0]); |
1718 | 1718 |
err |= __put_user(regs->lo, &sc->sc_lo[0]); |
1719 | 1719 |
if (cpu_has_dsp) { |
... | ... | |
1725 | 1725 |
err |= __put_user(mflo3(), &sc->sc_lo[3]); |
1726 | 1726 |
err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp); |
1727 | 1727 |
} |
1728 |
#endif |
|
1729 |
|
|
1730 |
|
|
1731 |
#endif |
|
1732 |
|
|
1728 |
#endif |
|
1729 |
#endif |
|
1733 | 1730 |
|
1734 |
#if 0
|
|
1731 |
#if 0 |
|
1735 | 1732 |
err |= __put_user(!!used_math(), &sc->sc_used_math); |
1736 | 1733 |
|
1737 | 1734 |
if (!used_math()) |
... | ... | |
1765 | 1762 |
err |= __get_user(regs->HI, &sc->sc_mdhi); |
1766 | 1763 |
err |= __get_user(regs->LO, &sc->sc_mdlo); |
1767 | 1764 |
|
1768 |
#define restore_gp_reg(i) do { \
|
|
1765 |
#define restore_gp_reg(i) do { \ |
|
1769 | 1766 |
err |= __get_user(regs->gpr[i], &sc->sc_regs[i]); \ |
1770 | 1767 |
} while(0) |
1771 | 1768 |
restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3); |
... | ... | |
1779 | 1776 |
restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27); |
1780 | 1777 |
restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30); |
1781 | 1778 |
restore_gp_reg(31); |
1782 |
#undef restore_gp_reg
|
|
1779 |
#undef restore_gp_reg |
|
1783 | 1780 |
|
1784 | 1781 |
#if 0 |
1785 | 1782 |
if (cpu_has_dsp) { |
... | ... | |
1791 | 1788 |
err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg); |
1792 | 1789 |
err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK); |
1793 | 1790 |
} |
1794 |
#ifdef CONFIG_64BIT
|
|
1791 |
#ifdef CONFIG_64BIT |
|
1795 | 1792 |
err |= __get_user(regs->hi, &sc->sc_hi[0]); |
1796 | 1793 |
err |= __get_user(regs->lo, &sc->sc_lo[0]); |
1797 | 1794 |
if (cpu_has_dsp) { |
... | ... | |
1803 | 1800 |
err |= __get_user(treg, &sc->sc_lo[3]); mthi3(treg); |
1804 | 1801 |
err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK); |
1805 | 1802 |
} |
1806 |
#endif
|
|
1803 |
#endif |
|
1807 | 1804 |
|
1808 | 1805 |
err |= __get_user(used_math, &sc->sc_used_math); |
1809 | 1806 |
conditional_used_math(used_math); |
... | ... | |
1898 | 1895 |
|
1899 | 1896 |
long do_sigreturn(CPUState *regs) |
1900 | 1897 |
{ |
1901 |
struct sigframe *frame; |
|
1902 |
sigset_t blocked; |
|
1903 |
target_sigset_t target_set; |
|
1904 |
int i; |
|
1898 |
struct sigframe *frame;
|
|
1899 |
sigset_t blocked;
|
|
1900 |
target_sigset_t target_set;
|
|
1901 |
int i;
|
|
1905 | 1902 |
|
1906 | 1903 |
#if defined(DEBUG_SIGNAL) |
1907 |
fprintf(stderr, "do_sigreturn\n"); |
|
1904 |
fprintf(stderr, "do_sigreturn\n");
|
|
1908 | 1905 |
#endif |
1909 |
frame = (struct sigframe *) regs->gpr[29]; |
|
1910 |
if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
|
1906 |
frame = (struct sigframe *) regs->gpr[29];
|
|
1907 |
if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
|
|
1911 | 1908 |
goto badframe; |
1912 | 1909 |
|
1913 |
for(i = 0; i < TARGET_NSIG_WORDS; i++) { |
|
1910 |
for(i = 0; i < TARGET_NSIG_WORDS; i++) {
|
|
1914 | 1911 |
if(__get_user(target_set.sig[i], &frame->sf_mask.sig[i])) |
1915 | 1912 |
goto badframe; |
1916 |
}
|
|
1913 |
}
|
|
1917 | 1914 |
|
1918 |
target_to_host_sigset_internal(&blocked, &target_set); |
|
1919 |
sigprocmask(SIG_SETMASK, &blocked, NULL); |
|
1915 |
target_to_host_sigset_internal(&blocked, &target_set);
|
|
1916 |
sigprocmask(SIG_SETMASK, &blocked, NULL);
|
|
1920 | 1917 |
|
1921 |
if (restore_sigcontext(regs, &frame->sf_sc)) |
|
1918 |
if (restore_sigcontext(regs, &frame->sf_sc))
|
|
1922 | 1919 |
goto badframe; |
1923 | 1920 |
|
1924 | 1921 |
#if 0 |
1925 |
/* |
|
1926 |
* Don't let your children do this ... |
|
1927 |
*/ |
|
1928 |
__asm__ __volatile__( |
|
1922 |
/*
|
|
1923 |
* Don't let your children do this ...
|
|
1924 |
*/
|
|
1925 |
__asm__ __volatile__(
|
|
1929 | 1926 |
"move\t$29, %0\n\t" |
1930 | 1927 |
"j\tsyscall_exit" |
1931 | 1928 |
:/* no outputs */ |
1932 | 1929 |
:"r" (®s)); |
1933 |
/* Unreached */ |
|
1930 |
/* Unreached */
|
|
1934 | 1931 |
#endif |
1935 | 1932 |
|
1936 | 1933 |
regs->PC = regs->CP0_EPC; |
1937 |
/* I am not sure this is right, but it seems to work |
|
1934 |
/* I am not sure this is right, but it seems to work
|
|
1938 | 1935 |
* maybe a problem with nested signals ? */ |
1939 | 1936 |
regs->CP0_EPC = 0; |
1940 | 1937 |
return 0; |
1941 | 1938 |
|
1942 | 1939 |
badframe: |
1943 |
force_sig(TARGET_SIGSEGV/*, current*/); |
|
1944 |
return 0; |
|
1945 |
|
|
1940 |
force_sig(TARGET_SIGSEGV/*, current*/); |
|
1941 |
return 0; |
|
1946 | 1942 |
} |
1947 | 1943 |
|
1948 | 1944 |
static void setup_rt_frame(int sig, struct emulated_sigaction *ka, |
... | ... | |
2070 | 2066 |
if (q != &k->info) |
2071 | 2067 |
free_sigqueue(q); |
2072 | 2068 |
} |
2073 |
|
|
2074 |
|
Also available in: Unified diff