OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [gnu-src/] [gdb-6.8/] [pre-binutils-2.20.1-sync/] [gdb/] [testsuite/] [gdb.arch/] [spu-info.c] - Diff between revs 157 and 223

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 157 Rev 223
/* Copyright 2007, 2008 Free Software Foundation, Inc.
/* Copyright 2007, 2008 Free Software Foundation, Inc.
 
 
   This program is free software; you can redistribute it and/or modify
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
   This file is part of the gdb testsuite.
   This file is part of the gdb testsuite.
 
 
   Contributed by Markus Deuling <deuling@de.ibm.com>.
   Contributed by Markus Deuling <deuling@de.ibm.com>.
   Tests for 'info spu' commands.  */
   Tests for 'info spu' commands.  */
 
 
#include <stdio.h>
#include <stdio.h>
#include <string.h>
#include <string.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <fcntl.h>
#include <spu_mfcio.h>
#include <spu_mfcio.h>
 
 
 
 
/* PPE-assisted call interface.  */
/* PPE-assisted call interface.  */
void
void
send_to_ppe (unsigned int signalcode, unsigned int opcode, void *data)
send_to_ppe (unsigned int signalcode, unsigned int opcode, void *data)
{
{
  __vector unsigned int stopfunc =
  __vector unsigned int stopfunc =
    {
    {
      signalcode,     /* stop */
      signalcode,     /* stop */
      (opcode << 24) | (unsigned int) data,
      (opcode << 24) | (unsigned int) data,
      0x4020007f,     /* nop */
      0x4020007f,     /* nop */
      0x35000000      /* bi $0 */
      0x35000000      /* bi $0 */
    };
    };
 
 
  void (*f) (void) = (void *) &stopfunc;
  void (*f) (void) = (void *) &stopfunc;
  asm ("sync");
  asm ("sync");
  f ();
  f ();
}
}
 
 
/* PPE-assisted call to mmap from SPU.  */
/* PPE-assisted call to mmap from SPU.  */
unsigned long long
unsigned long long
mmap_ea (unsigned long long start, size_t length,
mmap_ea (unsigned long long start, size_t length,
         int prot, int flags, int fd, off_t offset)
         int prot, int flags, int fd, off_t offset)
{
{
  struct mmap_args
  struct mmap_args
    {
    {
      unsigned long long start __attribute__ ((aligned (16)));
      unsigned long long start __attribute__ ((aligned (16)));
      size_t length __attribute__ ((aligned (16)));
      size_t length __attribute__ ((aligned (16)));
      int prot __attribute__ ((aligned (16)));
      int prot __attribute__ ((aligned (16)));
      int flags __attribute__ ((aligned (16)));
      int flags __attribute__ ((aligned (16)));
      int fd __attribute__ ((aligned (16)));
      int fd __attribute__ ((aligned (16)));
      off_t offset __attribute__ ((aligned (16)));
      off_t offset __attribute__ ((aligned (16)));
    } args;
    } args;
 
 
  args.start = start;
  args.start = start;
  args.length = length;
  args.length = length;
  args.prot = prot;
  args.prot = prot;
  args.flags = flags;
  args.flags = flags;
  args.fd = fd;
  args.fd = fd;
  args.offset = offset;
  args.offset = offset;
 
 
  send_to_ppe (0x2101, 11, &args);
  send_to_ppe (0x2101, 11, &args);
  return args.start;
  return args.start;
}
}
 
 
/* This works only in a Linux environment with <= 1024 open
/* This works only in a Linux environment with <= 1024 open
   file descriptors for one process. Result is the file
   file descriptors for one process. Result is the file
   descriptor for the current context if available.  */
   descriptor for the current context if available.  */
int
int
find_context_fd (void)
find_context_fd (void)
{
{
  int dir_fd = -1;
  int dir_fd = -1;
  int i;
  int i;
 
 
  for (i = 0; i < 1024; i++)
  for (i = 0; i < 1024; i++)
    {
    {
      struct stat stat;
      struct stat stat;
 
 
      if (fstat (i, &stat) < 0)
      if (fstat (i, &stat) < 0)
        break;
        break;
      if (S_ISDIR (stat.st_mode))
      if (S_ISDIR (stat.st_mode))
        dir_fd = dir_fd == -1 ? i : -2;
        dir_fd = dir_fd == -1 ? i : -2;
    }
    }
  return dir_fd < 0 ? -1 : dir_fd;
  return dir_fd < 0 ? -1 : dir_fd;
}
}
 
 
/* Open the context file and return the file handler.  */
/* Open the context file and return the file handler.  */
int
int
open_context_file (int context_fd, char *name, int flags)
open_context_file (int context_fd, char *name, int flags)
{
{
  char buf[128];
  char buf[128];
 
 
  if (context_fd < 0)
  if (context_fd < 0)
    return -1;
    return -1;
 
 
  sprintf (buf, "/proc/self/fd/%d/%s", context_fd, name);
  sprintf (buf, "/proc/self/fd/%d/%s", context_fd, name);
  return open (buf, flags);
  return open (buf, flags);
}
}
 
 
 
 
int
int
do_event_test ()
do_event_test ()
{
{
  spu_write_event_mask (MFC_MULTI_SRC_SYNC_EVENT); /* 0x1000 */  /* Marker Event */
  spu_write_event_mask (MFC_MULTI_SRC_SYNC_EVENT); /* 0x1000 */  /* Marker Event */
  spu_write_event_mask (MFC_PRIV_ATTN_EVENT); /* 0x0800 */
  spu_write_event_mask (MFC_PRIV_ATTN_EVENT); /* 0x0800 */
  spu_write_event_mask (MFC_LLR_LOST_EVENT); /* 0x0400 */
  spu_write_event_mask (MFC_LLR_LOST_EVENT); /* 0x0400 */
  spu_write_event_mask (MFC_SIGNAL_NOTIFY_1_EVENT); /* 0x0200 */
  spu_write_event_mask (MFC_SIGNAL_NOTIFY_1_EVENT); /* 0x0200 */
  spu_write_event_mask (MFC_SIGNAL_NOTIFY_2_EVENT); /* 0x0100 */
  spu_write_event_mask (MFC_SIGNAL_NOTIFY_2_EVENT); /* 0x0100 */
  spu_write_event_mask (MFC_OUT_MBOX_AVAILABLE_EVENT); /* 0x0080 */
  spu_write_event_mask (MFC_OUT_MBOX_AVAILABLE_EVENT); /* 0x0080 */
  spu_write_event_mask (MFC_OUT_INTR_MBOX_AVAILABLE_EVENT); /* 0x0040 */
  spu_write_event_mask (MFC_OUT_INTR_MBOX_AVAILABLE_EVENT); /* 0x0040 */
  spu_write_event_mask (MFC_DECREMENTER_EVENT); /* 0x0020 */
  spu_write_event_mask (MFC_DECREMENTER_EVENT); /* 0x0020 */
  spu_write_event_mask (MFC_IN_MBOX_AVAILABLE_EVENT); /* 0x0010 */
  spu_write_event_mask (MFC_IN_MBOX_AVAILABLE_EVENT); /* 0x0010 */
  spu_write_event_mask (MFC_COMMAND_QUEUE_AVAILABLE_EVENT); /* 0x0008 */
  spu_write_event_mask (MFC_COMMAND_QUEUE_AVAILABLE_EVENT); /* 0x0008 */
  spu_write_event_mask (MFC_LIST_STALL_NOTIFY_EVENT); /* 0x0002 */
  spu_write_event_mask (MFC_LIST_STALL_NOTIFY_EVENT); /* 0x0002 */
  spu_write_event_mask (MFC_TAG_STATUS_UPDATE_EVENT); /* 0x0001 */
  spu_write_event_mask (MFC_TAG_STATUS_UPDATE_EVENT); /* 0x0001 */
 
 
  return 0;
  return 0;
}
}
 
 
int
int
do_dma_test ()
do_dma_test ()
{
{
  #define MAP_FAILED      (-1ULL)
  #define MAP_FAILED      (-1ULL)
  #define PROT_READ       0x1
  #define PROT_READ       0x1
  #define MAP_PRIVATE     0x002
  #define MAP_PRIVATE     0x002
  #define BSIZE 128
  #define BSIZE 128
  static char buf[BSIZE] __attribute__ ((aligned (128)));
  static char buf[BSIZE] __attribute__ ((aligned (128)));
  char *file = "/var/tmp/tmp_buf";
  char *file = "/var/tmp/tmp_buf";
  struct stat fdstat;
  struct stat fdstat;
  int fd, cnt;
  int fd, cnt;
  unsigned long long src;
  unsigned long long src;
 
 
  /* Create a file and fill it with some bytes.  */
  /* Create a file and fill it with some bytes.  */
  fd = open (file, O_CREAT | O_RDWR | O_TRUNC, 0777);
  fd = open (file, O_CREAT | O_RDWR | O_TRUNC, 0777);
  if (fd == -1)
  if (fd == -1)
    return -1;
    return -1;
  memset ((void *)buf, '1', BSIZE);
  memset ((void *)buf, '1', BSIZE);
  write (fd, buf, BSIZE);
  write (fd, buf, BSIZE);
  write (fd, buf, BSIZE);
  write (fd, buf, BSIZE);
  memset ((void *)buf, 0, BSIZE);
  memset ((void *)buf, 0, BSIZE);
 
 
  if (fstat (fd, &fdstat) != 0
  if (fstat (fd, &fdstat) != 0
      || !fdstat.st_size)
      || !fdstat.st_size)
    return -2;
    return -2;
 
 
  src = mmap_ea(0ULL, fdstat.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
  src = mmap_ea(0ULL, fdstat.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
  if (src == MAP_FAILED)
  if (src == MAP_FAILED)
    return -3;
    return -3;
 
 
  /* Copy some data via DMA.  */
  /* Copy some data via DMA.  */
  mfc_get (&buf, src, BSIZE, 5, 0, 0);   /* Marker DMA */
  mfc_get (&buf, src, BSIZE, 5, 0, 0);   /* Marker DMA */
  mfc_write_tag_mask (1<<5);   /* Marker DMAWait */
  mfc_write_tag_mask (1<<5);   /* Marker DMAWait */
  spu_mfcstat (MFC_TAG_UPDATE_ALL);
  spu_mfcstat (MFC_TAG_UPDATE_ALL);
 
 
  /* Close the file.  */
  /* Close the file.  */
  close (fd);
  close (fd);
 
 
  return cnt;
  return cnt;
}
}
 
 
int
int
do_mailbox_test ()
do_mailbox_test ()
{
{
  /* Write to SPU Outbound Mailbox.  */
  /* Write to SPU Outbound Mailbox.  */
  if (spu_stat_out_mbox ())            /* Marker Mbox */
  if (spu_stat_out_mbox ())            /* Marker Mbox */
    spu_write_out_mbox (0x12345678);
    spu_write_out_mbox (0x12345678);
 
 
  /* Write to SPU Outbound Interrupt Mailbox.  */
  /* Write to SPU Outbound Interrupt Mailbox.  */
  if (spu_stat_out_intr_mbox ())
  if (spu_stat_out_intr_mbox ())
    spu_write_out_intr_mbox (0x12345678);
    spu_write_out_intr_mbox (0x12345678);
 
 
  return 0;       /* Marker MboxEnd */
  return 0;       /* Marker MboxEnd */
}
}
 
 
int
int
do_signal_test ()
do_signal_test ()
{
{
  struct stat fdstat;
  struct stat fdstat;
  int context_fd = find_context_fd ();
  int context_fd = find_context_fd ();
  int ret, buf, fd;
  int ret, buf, fd;
 
 
  buf = 23;    /* Marker Signal */
  buf = 23;    /* Marker Signal */
  /* Write to signal1.  */
  /* Write to signal1.  */
  fd = open_context_file (context_fd, "signal1", O_RDWR);
  fd = open_context_file (context_fd, "signal1", O_RDWR);
  if (fstat (fd, &fdstat) != 0)
  if (fstat (fd, &fdstat) != 0)
    return -1;
    return -1;
  ret = write (fd, buf, sizeof (int));
  ret = write (fd, buf, sizeof (int));
  close (fd);  /* Marker Signal1 */
  close (fd);  /* Marker Signal1 */
 
 
  /* Write to signal2.  */
  /* Write to signal2.  */
  fd = open_context_file (context_fd, "signal2", O_RDWR);
  fd = open_context_file (context_fd, "signal2", O_RDWR);
  if (fstat (fd, &fdstat) != 0)
  if (fstat (fd, &fdstat) != 0)
    return -1;
    return -1;
  ret = write (fd, buf, sizeof (int));
  ret = write (fd, buf, sizeof (int));
  close (fd);  /* Marker Signal2 */
  close (fd);  /* Marker Signal2 */
 
 
  /* Read signal1.  */
  /* Read signal1.  */
  if (spu_stat_signal1 ())
  if (spu_stat_signal1 ())
    ret = spu_read_signal1 ();
    ret = spu_read_signal1 ();
 
 
  /* Read signal2.  */
  /* Read signal2.  */
  if (spu_stat_signal2 ())
  if (spu_stat_signal2 ())
    ret = spu_read_signal2 ();   /* Marker SignalRead */
    ret = spu_read_signal2 ();   /* Marker SignalRead */
 
 
  return 0;
  return 0;
}
}
 
 
int
int
main (unsigned long long speid, unsigned long long argp,
main (unsigned long long speid, unsigned long long argp,
      unsigned long long envp)
      unsigned long long envp)
{
{
  int res;
  int res;
 
 
  /* info spu event  */
  /* info spu event  */
  res = do_event_test ();
  res = do_event_test ();
 
 
  /* info spu dma  */
  /* info spu dma  */
  res = do_dma_test ();
  res = do_dma_test ();
 
 
  /* info spu mailbox  */
  /* info spu mailbox  */
  res = do_mailbox_test ();
  res = do_mailbox_test ();
 
 
  /* info spu signal  */
  /* info spu signal  */
  res = do_signal_test ();
  res = do_signal_test ();
 
 
  return 0;
  return 0;
}
}
 
 
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.