summaryrefslogtreecommitdiff
path: root/gcell/lib/runtime/gc_jd_stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcell/lib/runtime/gc_jd_stack.c')
-rw-r--r--gcell/lib/runtime/gc_jd_stack.c168
1 files changed, 0 insertions, 168 deletions
diff --git a/gcell/lib/runtime/gc_jd_stack.c b/gcell/lib/runtime/gc_jd_stack.c
deleted file mode 100644
index 4d865acf0..000000000
--- a/gcell/lib/runtime/gc_jd_stack.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/* -*- c -*- */
-/*
- * Copyright 2007 Free Software Foundation, Inc.
- *
- * This file is part of GNU Radio
- *
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3, or (at your option)
- * any later version.
- *
- * GNU Radio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <gcell/gc_jd_stack.h>
-#include <gcell/memory_barrier.h>
-
-/*
- * begin extract from ppu_intrinics.h
- * FIXME handle this a different way
- */
-
-#if !defined(__PPU__) && !defined(__ppc__) && !defined(__ppc64__)
- && !defined(__GNUC__)
- #error ppu_intrinsics.h included on wrong platform/compiler
-#endif
-
-#define __lwarx(base) __extension__ \
- ({unsigned int result; \
- typedef struct {char a[4];} wordsize; \
- wordsize *ptrp = (wordsize*)(base); \
- __asm__ volatile ("lwarx %0,%y1" \
- : "=r" (result) \
- : "Z" (*ptrp)); \
- result; })
-
-#ifdef __powerpc64__
-#define __ldarx(base) __extension__ \
- ({unsigned long long result; \
- typedef struct {char a[8];} doublewordsize; \
- doublewordsize *ptrp = (doublewordsize*)(base); \
- __asm__ volatile ("ldarx %0,%y1" \
- : "=r" (result) \
- : "Z" (*ptrp)); \
- result; })
-#endif /* __powerpc64__ */
-
-#define __stwcx(base, value) __extension__ \
- ({unsigned int result; \
- typedef struct {char a[4];} wordsize; \
- wordsize *ptrp = (wordsize*)(base); \
- __asm__ volatile ("stwcx. %2,%y1\n" \
- "\tmfocrf %0,0x80" \
- : "=r" (result), \
- "=Z" (*ptrp) \
- : "r" (value)); \
- ((result & 0x20000000) >> 29); })
-
-
-#ifdef __powerpc64__
-#define __stdcx(base, value) __extension__ \
- ({unsigned long long result; \
- typedef struct {char a[8];} doublewordsize; \
- doublewordsize *ptrp = (doublewordsize*)(base); \
- __asm__ volatile ("stdcx. %2,%y1\n" \
- "\tmfocrf %0,0x80" \
- : "=r" (result), \
- "=Z" (*ptrp) \
- : "r" (value)); \
- ((result & 0x20000000) >> 29); })
-#endif /* __powerpc64__ */
-
-
-/*
- * --- end extract from ppu_intrinics.h --
- */
-
-
-void
-gc_jd_stack_init(gc_jd_stack_t *stack)
-{
- stack->top = 0;
-}
-
-
-#ifdef __powerpc64__ // 64-bit mode
-
-void
-gc_jd_stack_push(gc_jd_stack_t *stack, gc_job_desc_t *item)
-{
- gc_eaddr_t top;
- gc_eaddr_t item_ea = ptr_to_ea(item);
- unsigned int done;
-
- do {
- top = __ldarx(&stack->top);
- item->sys.next = top;
- smp_wmb(); // order store of item->next before store of stack->top
- done = __stdcx(&stack->top, item_ea);
- } while (unlikely(done == 0));
-}
-
-gc_job_desc_t *
-gc_jd_stack_pop(gc_jd_stack_t *stack)
-{
- gc_eaddr_t s;
- gc_eaddr_t t;
- unsigned int done;
-
- do {
- s = __ldarx(&stack->top);
- if (s == 0) /* stack's empty */
- return 0;
- t = ((gc_job_desc_t *) ea_to_ptr(s))->sys.next;
- done = __stdcx(&stack->top, t);
- } while (unlikely(done == 0));
-
- return ea_to_ptr(s);
-}
-
-#else // 32-bit mode
-
-/*
- * In 32-bit mode, gc_eaddr's will have the top 32-bits zero.
- * The ldarx/stdcx instructions aren't available in 32-bit mode,
- * thus we use lwarx/stwcx on the low 32-bits of the 64-bit addresses.
- * Since we're big-endian, the low 32-bits are at word offset 1.
- */
-void
-gc_jd_stack_push(gc_jd_stack_t *stack, gc_job_desc_t *item)
-{
- gc_eaddr_t top;
- unsigned int done;
-
- do {
- top = __lwarx((int32_t *)(&stack->top) + 1);
- item->sys.next = top;
- smp_wmb(); // order store of item->sys.next before store of stack->top
- done = __stwcx((int32_t *)(&stack->top) + 1, item);
- } while (unlikely(done == 0));
-}
-
-gc_job_desc_t *
-gc_jd_stack_pop(gc_jd_stack_t *stack)
-{
- gc_eaddr_t s;
- gc_eaddr_t t;
- unsigned int done;
-
- do {
- s = __lwarx((int32_t *)(&stack->top) + 1);
- if (s == 0) /* stack's empty */
- return 0;
- t = ((gc_job_desc_t *) ea_to_ptr(s))->sys.next;
- done = __stwcx((int32_t *)(&stack->top) + 1, (uint32_t) t);
- } while (unlikely(done == 0));
-
- return ea_to_ptr(s);
-}
-
-#endif