Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit40dde82

Browse files
committed
Fix spinlock assembly code for MIPS so it works on MIPS r6.
Original MIPS-I processors didn't have the LL/SC instructions (nor anyother userland synchronization primitive). If the build toolchaintargets that ISA variant by default, as an astonishingly large fractionof MIPS platforms still do, the assembler won't take LL/SC withoutcoercion in the form of a ".set mips2" instruction. But we issued thatunconditionally, making it an ISA downgrade for chips later than MIPS2.That breaks things for the latest MIPS r6 ISA, which encodes theseinstructions differently. Adjust the code so we don't change ISA levelif it's >= 2.Note that this patch doesn't change what happens on an actual MIPS-Iprocessor: either the kernel will emulate these instructionstransparently, or you'll get a SIGILL failure. That tradeoff seemedfine in 2002 when this code was added (cf3cbe6b2), and it's evenmore so today when MIPS-I is basically extinct. But let's add acomment about that.YunQiang Su (with cosmetic adjustments by me). Back-patch to allsupported branches.Discussion:https://postgr.es/m/15844-8f62fe7e163939b3@postgresql.org
1 parenta40dca8 commit40dde82

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

‎src/include/storage/s_lock.h

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -598,14 +598,31 @@ tas(volatile slock_t *lock)
598598

599599

600600
#if defined(__mips__)&& !defined(__sgi)/* non-SGI MIPS */
601-
/* Note: on SGI we use the OS' mutex ABI, see below */
602-
/* Note: R10000 processors require a separate SYNC */
603601
#defineHAS_TEST_AND_SET
604602

605603
typedefunsignedintslock_t;
606604

607605
#defineTAS(lock) tas(lock)
608606

607+
/*
608+
* Original MIPS-I processors lacked the LL/SC instructions, but if we are
609+
* so unfortunate as to be running on one of those, we expect that the kernel
610+
* will handle the illegal-instruction traps and emulate them for us. On
611+
* anything newer (and really, MIPS-I is extinct) LL/SC is the only sane
612+
* choice because any other synchronization method must involve a kernel
613+
* call. Unfortunately, many toolchains still default to MIPS-I as the
614+
* codegen target; if the symbol __mips shows that that's the case, we
615+
* have to force the assembler to accept LL/SC.
616+
*
617+
* R10000 and up processors require a separate SYNC, which has the same
618+
* issues as LL/SC.
619+
*/
620+
#if__mips<2
621+
#defineMIPS_SET_MIPS2" .set mips2 \n"
622+
#else
623+
#defineMIPS_SET_MIPS2
624+
#endif
625+
609626
static __inline__int
610627
tas(volatileslock_t*lock)
611628
{
@@ -615,7 +632,7 @@ tas(volatile slock_t *lock)
615632

616633
__asm__ __volatile__(
617634
" .set push \n"
618-
" .set mips2 \n"
635+
MIPS_SET_MIPS2
619636
" .set noreorder \n"
620637
" .set nomacro \n"
621638
" ll %0, %2 \n"
@@ -637,7 +654,7 @@ do \
637654
{ \
638655
__asm__ __volatile__( \
639656
" .set push \n" \
640-
" .set mips2 \n" \
657+
MIPS_SET_MIPS2 \
641658
" .set noreorder \n" \
642659
" .set nomacro \n" \
643660
" sync \n" \

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp