Hacky v jadre [Was: Re: nechodici X Windows po rekompilaci jadra]

Stanislav Meduna stano na trillian.eunet.sk
Neděle Březen 1 10:05:12 CET 1998


Alexandr Malusek <malusek na hroch.ujf.cas.cz> wrote:

: _X11TransSocketUNIXConnect: Can't connect: errno = 111
:        It's a kernel bug. The function sys_iopl in
:        arch/i386/kernel/ioport.c does an illegal hack which used to work
:        but is now broken since GCC optimizes more aggressively . The
:        newer 2.1.x kernels already have a fix which should also work in
:        2.0.32.

diff-ol som si to a vyzera to skutocne dost zvlastne:

2.0.33:
asmlinkage int sys_iopl(long ebx,long ecx,long edx,
             long esi, long edi, long ebp, long eax, long ds,
             long es, long fs, long gs, long orig_eax,
             long eip,long cs,long eflags,long esp,long ss)
{
        unsigned int level = ebx;

        if (level > 3)
                return -EINVAL;
        if (!suser())
                return -EPERM;
        *(&eflags) = (eflags & 0xffffcfff) | (level << 12);
        return 0;
}

Z toho je pomerne zjavne, co egcs plnym pravom vyoptimalizoval (a aj trik,
ktory v tom zabranoval gcc).

2.1.88:
asmlinkage int sys_iopl(unsigned long unused)
{
        struct pt_regs * regs = (struct pt_regs *) &unused;
        unsigned int level = regs->ebx;

        if (level > 3)
                return -EINVAL;
        if (!suser())
                return -EPERM;
        regs->eflags = (regs->eflags & 0xffffcfff) | (level << 12);
        return 0;
}

Cize to iste, ale zamotane tak, aby do toho kompilator nevidel ...


Prasacina je to v kazdom pripade, co ostatne hovori aj komentar:

 * Here we just change the eflags value on the stack

Je mi jasne, ze v jadre sa clovek podobnym hackom obcas nevyhne, ale
osobne by som podobne veci radsej videl ako assemblerovsky kod, nez
spoliehat sa na sposob prace konkretneho kompilatora :-(

Zdravi
--
					Stano


Další informace o konferenci Linux