OSDN Git Service

[MIPS] Invalidate cached pid in vfork.
authorDuane Sand <duane.sand@imgtec.com>
Wed, 12 Aug 2015 00:00:56 +0000 (17:00 -0700)
committerElliott Hughes <enh@google.com>
Wed, 12 Aug 2015 02:28:05 +0000 (02:28 +0000)
Bug: http://b/23008979
Change-Id: I43e0c7db42602441313af4607a992caa8c7d6221

libc/arch-mips/bionic/vfork.S
libc/arch-mips64/bionic/vfork.S

index 1849624..7ccf70b 100644 (file)
@@ -37,6 +37,14 @@ ENTRY(vfork)
        .set    noreorder
        .cpload t9
 
+       // __get_tls()[TLS_SLOT_THREAD_ID]->cached_pid_ = 0
+       .set    push
+       .set    mips32r2
+       rdhwr   v0, $29                 // v0 = tls; kernel trap on mips32r1
+       .set    pop
+       lw      v0, REGSZ*1(v0)         // v0 = v0[TLS_SLOT_THREAD_ID ie 1]
+       sw      $0, REGSZ*2+4(v0)       // v0->cached_pid_ = 0
+
        li      a0, (CLONE_VM | CLONE_VFORK | SIGCHLD)
        li      a1, 0
        li      a2, 0
index d180a8c..e0a39ed 100644 (file)
@@ -46,6 +46,12 @@ LEAF(vfork,FRAMESZ)
        PTR_SUBU sp, FRAMESZ
 #endif
        SETUP_GP64(a5, vfork)
+
+       // __get_tls()[TLS_SLOT_THREAD_ID]->cached_pid_ = 0
+       rdhwr   v0, $29                 // v0 = tls
+       REG_L   v0, REGSZ*1(v0)         // v0 = v0[TLS_SLOT_THREAD_ID ie 1]
+       sw      $0, REGSZ*2+4(v0)       // v0->cached_pid_ = 0
+
        LI      a0, (CLONE_VM | CLONE_VFORK | SIGCHLD)
        move    a1, $0
        move    a2, $0