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" (&regs));
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