Subject: [nathanw_sa] Incorrect handling of _UC_USER in alpha SETC() macro?
To: None <tech-userlevel@netbsd.org>
From: Jason R Thorpe <thorpej@wasabisystems.com>
List: tech-userlevel
Date: 01/05/2003 17:56:27
The SETC() macro (used in _setcontext_u() in libpthread) looks like
this on alpha:

#define SETC(reg)                                       ; \
        ldl     t0, (UC_FLAGS)(reg)                     ; \
        ldiq    t1, 1                                   ; \
        sll     t1, _UC_USER_BIT, t1                    ; \
        and     t0, t1, t0                              ; \
        beq     t0, 1f                                  ; \
        .
        .
        .

i.e.:

	t0 = uc->uc_flags;
	t1 = (1 << _UC_USER_BIT);
	t0 = t0 & t1;

The "beq" insn on Alpha branches if the source operand is 0.  So, if I
am reading this right, it branches to the non-_UC_USER case if _UC_USER
is set, and falls through to the _UC_USER case for non-_UC_USER contexts.

I.e. the handling is exactly backwards.

Now, I have caught a cold, and am a little out of it today, so I could
appreciate a sanity check to make sure I'm not just being delusional.

-- 
        -- Jason R. Thorpe <thorpej@wasabisystems.com>