summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/i386/getenv.S
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/dietlibc/i386/getenv.S')
-rw-r--r--mdk-stage1/dietlibc/i386/getenv.S48
1 files changed, 48 insertions, 0 deletions
diff --git a/mdk-stage1/dietlibc/i386/getenv.S b/mdk-stage1/dietlibc/i386/getenv.S
new file mode 100644
index 000000000..dafbf37ee
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/getenv.S
@@ -0,0 +1,48 @@
+#include "PIC.h"
+
+.text
+.global getenv
+.type getenv,@function
+getenv:
+ pushl %esi
+ pushl %edi
+ movl 0xc(%esp), %edi
+ cld
+ movl %edi, %edx
+ xorl %eax, %eax
+ leal -1(%eax), %ecx
+ repnz scasb
+ not %ecx
+ dec %ecx
+ pushl %ecx
+ movl (%edx), %ecx
+
+ GET_1VAR environ, %esi # non-PIC: movl environ, %esi
+ jmp .Lloop
+
+.Lprepare:
+ movl (%edx), %ecx
+ movl %eax, %esi
+.Lloop:
+ lodsl
+ or %eax, %eax
+ jz .Lout
+ cmpb %cl, (%eax)
+ jnz .Lloop
+
+ movl %edx, %edi
+ xchg %esi, %eax
+ movl (%esp), %ecx
+ repz cmpsb
+ jne .Lprepare
+ or %ecx, %ecx
+ jnz .Lprepare
+ cmpb $'=', (%esi)
+ jne .Lprepare
+ leal 0x1(%esi), %eax
+.Lout:
+ popl %ecx
+ popl %edi
+ popl %esi
+ ret
+.size getenv, . - getenv