Recursive spinlock for C using ASM, revision #1
gate_Leave has a superfluous compiler hint:

    : "eax"


Since gate_Leave returns an int and eax is often (always?) used to return values this is probably costing you extra instructions (although it might not as the function is inline, depending on how clever your compiler is).

Indentation and Labels

Labels are quite important in assembly.  I'd consider adding indentation so that they are easier to find, a lot like you would indent the contents of a while loop.

asm volatile (
    "jmp gate_Enter_check\n"
"gate_Enter_wait:\n"
    "pause\n"
"gate_Enter_check:\n"
    "cmp %[lock], %[pass]\n"     // Skip if pass &gt;= lock
    "jge gate_Enter_skip\n"
    "mov %[lock], %%eax\n"       // Spinlock start
    "cmp %[gate], %%eax\n"       // Check if locked without lock cmd
    "je gate_Enter_wait\n"  // If locked, wait.
    "lock xchg %%eax, %[gate]\n" // Lock seems to be free, now we attempt to take it.
    "test %%eax, %%eax\n"
    "jnz gate_Enter_wait\n" // Spinlock end
"gate_Enter_skip:\n"
    "add %[lock], %[pass]\n"     // Checkin pass
    : [gate] "=m" (*gate), [pass] "=m" (*pass)
    : [lock] "r" (1)
    : "eax"
);


I'd consider minimising the contents of your spin section.  Some of the operations only need to be performed once (loading eax, checking pass).  I'm not sure you're really getting much benefit from the unlocked gate check, but without running tests I don't know either way:

asm volatile (
    "cmp %[lock], %[pass]\n" // We only need to check this once, if 
                             // this changes while we are in the lock,
                             // some other thread is messing with it and
                             // we are in trouble anyway.
    "jge gate_Held\n"  
    "mov %[lock], %%eax\n"   // Only need to load eax once, if it is ever
                             // changed, it's to 0 because we've just
                             // locked the gate

"gate_Enter_check:\n"
    "lock xchg %%eax, %[gate]\n" // Attempt to take it.
    "test %%eax, %%eax\n"
    "jz gate_Held\n" 
    "pause\n"
    "jmp gate_Enter_check\n"

"gate_Held:\n"
    "add %[lock], %[pass]\n"     
    : [gate] "=m" (*gate), [pass] "=m" (*pass)
    : [lock] "r" (1)
    : "eax"
);