Example #1
0
static int ioctl_get_opts(void *user_addr)
{
	struct pme_ctrl_opts opts;
	u32 val;

	if (copy_from_user(&opts, user_addr, sizeof(opts)))
		return -EFAULT;
	if (opts.flags & PME_CTRL_OPT_SWDB)
		opts.swdb = reg_get(regs, SWDB);
	if (opts.flags & PME_CTRL_OPT_EOSRP) {
		opts.eosrp = reg_get(regs, SREC);
		opts.eosrp &= PME_DMA_EOSRP_MASK; /* 18 lower bits */
	}
	if (opts.flags & PME_CTRL_OPT_DRCC)
		opts.drcc = reg_get(regs, DRCC);
	if (opts.flags & PME_CTRL_OPT_KVLTS) {
		val = reg_get(regs, KVLTS);
		opts.kvlts = val + 1;
	}
	if (opts.flags & PME_CTRL_OPT_MCL) {
		opts.mcl = reg_get(regs, KEC);
		opts.mcl &= PME_DMA_MCL_MASK; /* 15 lower bits */
	}
	if (copy_to_user(user_addr, &opts, sizeof(opts)))
		return -EFAULT;
	return 0;
};
Example #2
0
static int ioctl_set_opts(void *user_addr)
{
	struct pme_ctrl_opts opts;
	u32 val;

	if (copy_from_user(&opts, user_addr, sizeof(opts)))
		return -EFAULT;
	/* Validation */
	if (opts.flags & PME_CTRL_OPT_KVLTS)
		if (opts.kvlts < 1 || opts.kvlts > 16)
			return -EINVAL;
	if (opts.flags & PME_CTRL_OPT_SWDB)
		reg_set(regs, SWDB, opts.swdb);
	if (opts.flags & PME_CTRL_OPT_EOSRP) {
		val = reg_get(regs, SREC);
		/* 18 lower bits */
		val = (val & ~PME_DMA_EOSRP_MASK) |
			(opts.eosrp & PME_DMA_EOSRP_MASK);
		reg_set(regs, SREC, val);
	}
	if (opts.flags & PME_CTRL_OPT_DRCC)
		reg_set(regs, DRCC, opts.drcc);
	if (opts.flags & PME_CTRL_OPT_KVLTS) {
		val = opts.kvlts - 1;
		reg_set(regs, KVLTS, val);
	}
	if (opts.flags & PME_CTRL_OPT_MCL)  {
		val = reg_get(regs, KEC);
		/* 15 lower bits */
		val = (val & ~PME_DMA_MCL_MASK) |
			(opts.mcl & PME_DMA_MCL_MASK);
		reg_set(regs, KEC, val);
	}
	return 0;
};
Example #3
0
static int ioctl_fbm(void *user_addr)
{
	int loop;
	u32 a, b;
	struct pme_ctrl_fb fb;
	fb.blocksize[0] = reg_get(regs, FBL0SIZE);
	fb.blocksize[1] = reg_get(regs, FBL1SIZE);
	fb.blocksize[2] = reg_get(regs, FBL2SIZE);
	fb.blocksize[3] = reg_get(regs, FBL3SIZE);
	fb.blocksize[4] = reg_get(regs, FBL4SIZE);
	fb.blocksize[5] = reg_get(regs, FBL5SIZE);
	fb.blocksize[6] = reg_get(regs, FBL6SIZE);
	fb.blocksize[7] = reg_get(regs, FBL7SIZE);
	a = reg_get(regs, FBLAAR);
	b = reg_get(regs, FBLABR);
	for (loop = (PME_CHANNEL_MAX - 1); loop >= 0; loop--) {
		__fb_l_set(&fb.channels[loop].virt[0],
				(a >> (8 * loop))&0xff);
		__fb_l_set(&fb.channels[loop].virt[1],
				(b >> (8 * loop))&0xff);
	}
	if (copy_to_user(user_addr, &fb, sizeof(fb)))
		return -EFAULT;
	return 0;
}
Example #4
0
static int _init(netdev2_t *encdev)
{
    encx24j600_t *dev = (encx24j600_t *) encdev;

    DEBUG("encx24j600: starting initialization...\n");

    /* setup IO */
    gpio_init(dev->cs, GPIO_OUT);
    gpio_set(dev->cs);
    gpio_init_int(dev->int_pin, GPIO_IN_PU, GPIO_FALLING, encx24j600_isr, (void*)dev);

    if (spi_init_master(dev->spi, SPI_CONF_FIRST_RISING, ENCX24J600_SPI_SPEED) < 0) {
        return -1;
    }

    lock(dev);

    /* initialization procedure as described in data sheet (39935c.pdf) */
    do {
        do {
            xtimer_usleep(ENCX24J600_INIT_DELAY);
            reg_set(dev, ENC_EUDAST, 0x1234);
            xtimer_usleep(ENCX24J600_INIT_DELAY);
        } while (reg_get(dev, ENC_EUDAST) != 0x1234);

        while (!(reg_get(dev, ENC_ESTAT) & ENC_CLKRDY));

        /* issue System Reset */
        cmd(dev, ENC_SETETHRST);

        /* make sure initialization finalizes */
        xtimer_usleep(1000);
    } while (!(reg_get(dev, ENC_EUDAST) == 0x0000));

    /* configure flow control */
    phy_reg_set(dev, ENC_PHANA, 0x05E1);
    reg_set_bits(dev, ENC_ECON2, ENC_AUTOFC);

    /* setup receive buffer */
    reg_set(dev, ENC_ERXST, RX_BUFFER_START);
    reg_set(dev, ENC_ERXTAIL, RX_BUFFER_END);
    dev->rx_next_ptr = RX_BUFFER_START;

    /* configure receive filter to receive multicast frames */
    reg_set_bits(dev, ENC_ERXFCON, ENC_MCEN);

    /* setup interrupts */
    reg_set_bits(dev, ENC_EIE, ENC_PKTIE | ENC_LINKIE);
    cmd(dev, ENC_ENABLERX);
    cmd(dev, ENC_SETEIE);

    DEBUG("encx24j600: initialization complete.\n");

    unlock(dev);

#ifdef MODULE_NETSTATS_L2
    memset(&netdev->stats, 0, sizeof(netstats_t));
#endif
    return 0;
}
Example #5
0
static void _get_mac_addr(netdev2_t *encdev, uint8_t* buf)
{
    encx24j600_t * dev = (encx24j600_t *) encdev;
    uint16_t *addr = (uint16_t *) buf;

    lock(dev);

    addr[0] = reg_get(dev, MAADR1);
    addr[1] = reg_get(dev, MAADR2);
    addr[2] = reg_get(dev, MAADR3);

    unlock(dev);
}
Example #6
0
/* revision */
static int ioctl_rev(void *user_addr)
{
	struct pme_ctrl_rev rev;
	u32 rev1 = reg_get(regs, PME_IP_REV1);
	u32 rev2 = reg_get(regs, PME_IP_REV2);
	rev.ip_id = rev1 >> 16;
	rev.ip_mj = (rev1 & 0x0000FF00) >> 8;
	rev.ip_mn = rev1 & 0x000000FF;
	rev.ip_int = (rev2 & 0x00FF0000) >> 16;
	rev.ip_cfg = rev2 & 0x000000FF;
	if (copy_to_user(user_addr, &rev, sizeof(rev)))
		return -EFAULT;
	return 0;
}
Example #7
0
static void tn_dump_ep(tn_endpoint_t *fsep, int indent) {

        const char *prefix = dump_indent(indent);
        int newind = indent + 1;
        const char *eppref = dump_indent(newind);

        log_debug("%sprovider='%s';\n", prefix, fsep->base.ptype->name);
        log_debug("%sis_temporary='%d';\n", prefix, fsep->base.is_temporary);
        log_debug("%sis_assigned='%d';\n", prefix, fsep->base.is_assigned);
        log_debug("%shostname='%d';\n", prefix, fsep->hostname);
        log_debug("%sfiles={;\n", prefix);
        for (int i = 0; ; i++) {
                File *file = (File*) reg_get(&fsep->base.files, i);
                log_debug("%s// file at %p\n", eppref, file);
                if (file != NULL) {
                        log_debug("%s{\n", eppref, file);
                        if (file->file.handler->dump != NULL) {
                                file->file.handler->dump((file_t*)file, 0, newind+1);
                        }
                        log_debug("%s{\n", eppref, file);
                } else {
                        break;
                }
        }
        log_debug("%s}\n", prefix);
}
Example #8
0
static int _send(netdev2_t *netdev, const struct iovec *vector, int count) {
    encx24j600_t * dev = (encx24j600_t *) netdev;
    lock(dev);

    /* wait until previous packet has been sent */
    while ((reg_get(dev, ECON1) & TXRTS));

    /* copy packet to SRAM */
    size_t len = 0;

    for (int i = 0; i < count; i++) {
        sram_op(dev, WGPDATA, (i ? 0xFFFF : TX_BUFFER_START), vector[i].iov_base, vector[i].iov_len);
        len += vector[i].iov_len;
    }

    /* set start of TX packet and length */
    reg_set(dev, ETXST, TX_BUFFER_START);
    reg_set(dev, ETXLEN, len);

    /* initiate sending */
    cmd(dev, SETTXRTS);

    /* wait for sending to complete */
    /* (not sure if it is needed, keeping the line uncommented) */
    /*while ((reg_get(dev, ECON1) & TXRTS));*/

    unlock(dev);

    return len;
}
Example #9
0
static void _isr(netdev2_t *netdev)
{
    encx24j600_t *dev = (encx24j600_t *) netdev;

    uint16_t eir;

    lock(dev);
    cmd(dev, CLREIE);

    eir = reg_get(dev, EIR);

    /* check & handle link state change */
    if (eir & LINKIF) {
        uint16_t estat = reg_get(dev, ESTAT);

        netdev2_event_t event = (estat & PHYLNK) ?
            NETDEV2_EVENT_LINK_DOWN :
            NETDEV2_EVENT_LINK_UP;

        netdev->event_callback(netdev, event, NULL);
    }

    /* check & handle available packets */
    if (eir & PKTIF) {
        while (_packets_available(dev)) {
            unlock(dev);
            netdev->event_callback(netdev, NETDEV2_EVENT_RX_COMPLETE,
                    NULL);
            lock(dev);
        }
    }

    /* drop all flags */
    reg_clear_bits(dev, EIR, LINKIF);

    /* re-enable interrupt */
    gpio_irq_enable(dev->int_pin);
    cmd(dev, SETEIE);

    unlock(dev);
}
Example #10
0
/* This isr is invoked if an error occurs at the global level of the device
 * There isn't much we can do other than log the occurance and disable the
 * condition that caused the error */
static irqreturn_t global_isr(int irq, void *dev_id)
{
	u32 status = reg_get(regs, ISRCC);
	u32 enabled = reg_get(regs, IERCC);
	if (!status)
		/* The IRQ wasn't for us.  Let the kernel try the next handler
		 * registered on this irq */
		return IRQ_NONE;
	printk(KERN_ERR PMMOD PME_CTRL_PATH
		": Global Error ISR %d ISRCC is 0x%x\n", irq, status);
	/* Disable these error bits from asserting the interrupt again */
	reg_set(regs, IERCC, enabled & ~status);
	/* We need to be sure the posted write to IERCC has taken affect before
	 * the ISR exits (otherwise it will refire unnecessarily). To this end,
	 * we read the register back and compare, ensuring the write has to
	 * complete first. NB, we don't need smp_mb() here or any such thing
	 * because the CPU can't reorder the initiation of the read/write pair
	 * due to the interdependency of the operations. */
	if (reg_get(regs, IERCC) != (enabled & ~status))
		printk(KERN_ERR PMMOD PME_CTRL_PATH ": IERCC inconsistency\n");
	wake_up_all(&monitor_queue);
	return IRQ_HANDLED;
}
Example #11
0
static int ioctl_monitor(void *user_addr)
{
	int res = 0;
	struct pme_monitor_poll p;
	if (copy_from_user(&p, user_addr, sizeof(p)))
		return -EFAULT;
	/* Disable bits as requested */
	if (p.disable_mask)
		reg_set(regs, ISDRCC, reg_get(regs, ISDRCC) | p.disable_mask);
	/* Clear status bits corresponding to those requested as well as those
	 * disabled */
	if (p.clear_mask | p.disable_mask)
		reg_set(regs, ISRCC, p.clear_mask | p.disable_mask);
	/* Re-enable bits we may have cleared in the enable register */
	if (p.clear_mask)
		reg_set(regs, IERCC, reg_get(regs, IERCC) | p.clear_mask);
	if (p.block) {
		if (p.timeout_ms) {
			res = wait_event_interruptible_timeout(monitor_queue,
				reg_get(regs, ISRCC) & ~(p.ignore_mask),
				msecs_to_jiffies(p.timeout_ms));
			if (res > 0)
				res = 0;
			else if (!res)
				res = 1;
		} else
			res = wait_event_interruptible(monitor_queue,
				reg_get(regs, ISRCC) & ~(p.ignore_mask));
		if (res < 0)
			res = -EINTR;
	}
	p.status = reg_get(regs, ISRCC);
	if (copy_to_user(user_addr, &p, sizeof(p)))
		return -EFAULT;
	return res;
}
Example #12
0
static void tnp_dump(int indent) {

        const char *prefix = dump_indent(indent);
        int newind = indent + 1;
        const char *eppref = dump_indent(newind);

        log_debug("%s// tcp system provider\n", prefix);
        log_debug("%sendpoints={\n", prefix);
        for (int i = 0; ; i++) {
                tn_endpoint_t *fsep = (tn_endpoint_t*) reg_get(&endpoints, i);
                if (fsep != NULL) {
                        log_debug("%s// endpoint %p\n", eppref, fsep);
                        log_debug("%s{\n", eppref);
                        tn_dump_ep(fsep, newind+1);
                        log_debug("%s}\n", eppref);
                } else {
                        break;
                }
        }
        log_debug("%s}\n", prefix);
}
Example #13
0
static pic_value
reg_call(pic_state *pic)
{
  struct pic_proc *self = pic_get_proc(pic);
  struct pic_reg *reg;
  pic_value key, val;
  int n;

  n = pic_get_args(pic, "o|o", &key, &val);

  if (! pic_obj_p(key)) {
    pic_errorf(pic, "attempted to set a non-object key '~s' in a register", key);
  }

  reg = pic_reg_ptr(pic_proc_env_ref(pic, self, "reg"));

  if (n == 1) {
    return reg_get(pic, reg, pic_obj_ptr(key));
  } else {
    return reg_set(pic, reg, pic_obj_ptr(key), val);
  }
}
Example #14
0
// reg_allocate - allocates a register to hold value
reg* reg_allocate(VALUE value){
	reg *res, *reg;

	reg=reg_get();	// reuse another register
	// isVar(reg->value)
	if(reg!=NULL && reg->dirty==true){
		// saves 'reg' in memory (solution: check for other reg/ print the instruction?)
		res=reg;
	}
	else
		res=reg;

	copy(res->value, value);
	res->dist=-1;
	res->free=false;


	#ifdef VERBOSE
		printf(" [reg_allocate]\t \'%s\' ~~~> \'%s\'\n", value, res->name);
	#endif

	return res;
}
Example #15
0
void cpu_instr_cswap(const sInstrArgs *iargs) {
	octa addr = iargs->y + iargs->z;
	octa mem = mmu_readOcta(addr,MEM_SIDE_EFFECTS);
	if(mem == reg_getSpecial(rP)) {
		// we have the problem here that both reg_set and mmu_writeOcta might throw an exception
		// therefore we use the following trick...
		octa val = reg_get(iargs->x);
		// first, set X to an arbitrary value. if it throws, we haven't change anything yet
		reg_set(iargs->x,0);
		// if not, we're here and reset the register
		reg_set(iargs->x,val);
		// if mmu_writeOcta throws, we haven't changed anything yet
		mmu_writeOcta(addr,val,MEM_SIDE_EFFECTS);
		// if not, we're here and set X again. but this can't throw again since it would have
		// already done that before
		reg_set(iargs->x,1);
	}
	else {
		// reg_set has to be done first, because it might throw an exception
		reg_set(iargs->x,0);
		reg_setSpecial(rP,mem);
	}
}
Example #16
0
static int ioctl_sre_reset(void *user_addr)
{
	struct pme_sre_reset reset_vals;
	unsigned int i = 0, loop = 100000;
	unsigned long reg_ptr = SRRV0;

	if (copy_from_user(&reset_vals, user_addr, sizeof(reset_vals)))
		return -EFAULT;
	/* Validate ranges */
	if ((reset_vals.rule_index > PME_DMA_SRE_INDEX_MAX) ||
			(reset_vals.rule_increment > PME_DMA_SRE_INC_MAX) ||
			(reset_vals.rule_repetitions > PME_DMA_SRE_REP_MAX) ||
			(reset_vals.rule_reset_interval >
				PME_DMA_SRE_INTERVAL_MAX))
		return -ERANGE;
	/* Check and make sure only one caller is present */
	if (!atomic_dec_and_test(&sre_reset_lock)) {
		/* Someone else is already in this call */
		atomic_inc(&sre_reset_lock);
		return -EBUSY;
	};
	/* All validated.  Run the command */
	for (; i < PME_SRE_RULE_VECTOR_SIZE; i++)
		reg_set(regs, reg_ptr++, reset_vals.rule_vector[i]);
	reg_set(regs, SRRFI, reset_vals.rule_index);
	reg_set(regs, SRRI, reset_vals.rule_increment);
	reg_set(regs, SRRWC, (0xFFF & reset_vals.rule_reset_interval) << 1 |
			(reset_vals.rule_reset_priority ? 1 : 0));
	/* Need to set SRRR last */
	reg_set(regs, SRRR, reset_vals.rule_repetitions);
	do {
		mdelay(PME_DMA_SRE_POLL_MS);
	} while (reg_get(regs, SRRR) || !(loop--));
	atomic_inc(&sre_reset_lock);
	return 0;
}
 static bool bit_get(const addr_type address, const reg_type value) { return (static_cast<volatile reg_type>(reg_get(address) & static_cast<reg_type>(1UL << value)) != static_cast<reg_type>(0U)); }
 static void reg_msk(const addr_type address, const reg_type value,
                     const reg_type mask_value)                     { *reinterpret_cast<volatile reg_type*>(address) = reg_type(reg_type(reg_get(address) & reg_type(~mask_value)) | reg_type(value & mask_value)); }
Example #19
0
static void test_regunsave0(void) {
	static octa specials[SPECIAL_NUM];
	static octa locals[LREG_NUM];
	static octa globals[GREG_NUM];

	// set some state
	reg_setSpecial(rG,100);
	reg_setSpecial(rS,0x1000);
	reg_setSpecial(rO,0x1000);
	for(size_t i = 100; i < GREG_NUM; i++)
		reg_setGlobal(i,i);
	for(size_t i = 0; i < 10; i++)
		reg_set(i,i);

	// backup
	for(size_t i = 0; i < LREG_NUM; i++)
		locals[i] = reg_get(i);
	for(size_t i = 100; i < GREG_NUM; i++)
		globals[i] = reg_getGlobal(i);
	for(size_t i = 0; i < SPECIAL_NUM; i++)
		specials[i] = reg_getSpecial(i);

	// arrange things so that an unsave fails at the beginning
	{
		jmp_buf env;
		int ex = setjmp(env);
		if(ex != EX_NONE) {
			for(size_t i = 0; i < LREG_NUM; i++)
				test_assertOcta(reg_get(i),locals[i]);
			for(size_t i = 100; i < GREG_NUM; i++)
				test_assertOcta(reg_getGlobal(i),globals[i]);
			for(size_t i = 0; i < SPECIAL_NUM; i++)
				test_assertOcta(reg_getSpecial(i),specials[i]);
		}
		else {
			ex_push(&env);
			reg_unsave(STACK_ADDR,false);
			test_assertFalse(true);
		}
		ex_pop();
	}

	// PTE 1 for 0x100000000 .. 0x1FFFFFFFF (---)
	cache_write(CACHE_DATA,0x400000008,0x0000000400000000,0);
	// PTE 2 for 0x200000000 .. 0x2FFFFFFFF (rwx)
	cache_write(CACHE_DATA,0x400000010,0x0000000500000007,0);

	// arrange things so that an unsave fails when reading rL
	{
		// set rG|rA
		mmu_writeOcta(0x200000020,0xFE00000000000000,MEM_SIDE_EFFECTS);

		jmp_buf env;
		int ex = setjmp(env);
		if(ex != EX_NONE) {
			for(size_t i = 0; i < LREG_NUM; i++)
				test_assertOcta(reg_get(i),locals[i]);
			for(size_t i = 100; i < GREG_NUM; i++)
				test_assertOcta(reg_getGlobal(i),globals[i]);
			for(size_t i = 0; i < SPECIAL_NUM; i++)
				test_assertOcta(reg_getSpecial(i),specials[i]);
		}
		else {
			ex_push(&env);
			reg_unsave(0x200000020,false);
			test_assertFalse(true);
		}
		ex_pop();
	}

	// arrange things so that an unsave fails when testing the range
	{
		// set rG|rA
		mmu_writeOcta(0x200000080,0xFE00000000000000,MEM_SIDE_EFFECTS);

		jmp_buf env;
		int ex = setjmp(env);
		if(ex != EX_NONE) {
			for(size_t i = 0; i < LREG_NUM; i++)
				test_assertOcta(reg_get(i),locals[i]);
			for(size_t i = 100; i < GREG_NUM; i++)
				test_assertOcta(reg_getGlobal(i),globals[i]);
			for(size_t i = 0; i < SPECIAL_NUM; i++)
				test_assertOcta(reg_getSpecial(i),specials[i]);
		}
		else {
			ex_push(&env);
			reg_unsave(0x200000080,false);
			test_assertFalse(true);
		}
		ex_pop();
	}

	// arrange things so that it works, but one value more would fail
	{
		// we have 13 specials, rL, rL locals and rG globals
		octa off = (13 + 1 + 10 + (256 - 254) - 1) * sizeof(octa);
		// set rG|rA
		mmu_writeOcta(0x200000000 + off,0xFE00000000000000,MEM_SIDE_EFFECTS);
		// rL is saved 13+rG positions further
		mmu_writeOcta(0x200000000 + off - (13 + (256 - 254)) * sizeof(octa),10,MEM_SIDE_EFFECTS);

		reg_unsave(0x200000000 + off,false);
		test_assertTrue(true);
		test_assertOcta(reg_getSpecial(rG),254);
		test_assertOcta(reg_getSpecial(rL),10);
		// this proves that one read more would have failed
		test_assertOcta(reg_getSpecial(rS),0x200000000);
		test_assertOcta(reg_getSpecial(rO),0x200000000);
	}

	// undo mapping
	cache_write(CACHE_DATA,0x400000008,0,0);
	cache_write(CACHE_DATA,0x400000010,0,0);
	tc_removeAll(TC_DATA);
}
Example #20
0
static int
get_error_msg (int err_code, char *msg_buf)
{
  FILE *fp;
  char *p;
  int i;
  char buf[1024];
  char default_err_msg_file[PATH_MAX];

  msg_buf[0] = '\0';

#ifdef DISPATCHER
  strcpy (default_err_msg_file, ERROR_MSG_FILE);
#else
  get_cubrid_file (FID_UV_ERR_MSG, default_err_msg_file);
#endif

#if defined(WINDOWS) && defined(DISPATCHER)
  if (reg_get (REG_ERR_MSG, buf, sizeof (buf)) < 0)
    return -1;
  fp = fopen (buf, "r");
  if (fp == NULL)
    return -1;
#else
  p = getenv ("UW_ER_MSG");
  if (p == NULL)
    {
      fp = fopen (default_err_msg_file, "r");
    }
  else
    {
      fp = fopen (p, "r");
      if (fp == NULL)
	{
	  fp = fopen (default_err_msg_file, "r");
	}
    }
  if (fp == NULL)
    {
      return -1;
    }
#endif

  for (i = 0; i < err_code; i++)
    {
      if (fgets (buf, sizeof (buf), fp) == NULL)
	{
	  fclose (fp);
	  return -1;
	}
    }

  if (fgets (buf, sizeof (buf), fp) == NULL)
    {
      fclose (fp);
      return -1;
    }

  p = strchr (buf, ':');
  if ((p == NULL) || (atoi (buf) != err_code))
    {
      fclose (fp);
      return -1;
    }
  if (*(p + 1) == ' ')
    p++;
  strcpy (msg_buf, p + 1);
  fclose (fp);
  return 0;
}
Example #21
0
/**
 * returns the status of the execution
 *  0 = normal end
 *  1 = expect mismatch
 */
int execute_script(int sockfd, int toolsfd, registry_t *script) {

	// current "pc" pointer to script line
	int curpos = 0;	
	line_t *line = NULL;
	int lineno = 0;

	int err = 0;
	ssize_t size = 0;
	line_t *errmsg = NULL;
	scriptlet_t *scr = NULL;

	// guaranteed to be valid; toolsfd may be not set (<0)
	int curfd = sockfd;

	while ( (err == 0) && (line = reg_get(script, curpos)) != NULL) {

		lineno = line->num;

		switch (line->cmd) {
		case CMD_COMMENT:
			if (!trace) {
				break;
			}
			// fall-through
		case CMD_MESSAGE:
			log_info("> %s\n", line->buffer);
			break;
		case CMD_ERRMSG:
			errmsg = line;
			break;
		case CMD_SEND:
			for (int i = 0; (scr = reg_get(&line->scriptlets, i)) != NULL; i++) {
				if (scr->exec != NULL) {
					scr->exec(line, scr);
				}
			}
			if (trace) {
				log_hexdump2(line->buffer, line->length, 0, "Send  : ");
			}

			size = write(curfd, line->buffer, line->length);
			if (size < 0) {
				log_errno("Error writing to socket at line %d\n", lineno);
				err = -1;
			}
			break;
		case CMD_EXPECT:
			line->mask = mem_alloc_c(line->length, "line_mask");
			memset(line->mask, 0xff, line->length);
			for (int i = 0; (scr = reg_get(&line->scriptlets, i)) != NULL; i++) {
				if (scr->exec != NULL) {
					scr->exec(line, scr);
				}
			}
			err = compare_packet(curfd, line->buffer, line->mask, line->length, lineno);
			mem_free(line->mask);
			line->mask = NULL;

			if (err != 0) {
				if (errmsg != NULL) {
					log_error("> %d: %s -> %d\n", lineno, errmsg->buffer, err);
				}
				return 1;
			}
			break;
		case CMD_INIT:
			send_sync(curfd);
			err = compare_packet(curfd, line->buffer, NULL, line->length, lineno);
			if (err != 0) {
				if (errmsg != NULL) {
					log_error("> %d: %s -> %d\n", lineno, errmsg->buffer, err);
				}
				return 1;
			}
			break;
		case CMD_CHANNEL:
			if ((!strcmp("tools", line->buffer)) && toolsfd >= 0) {
				curfd = toolsfd;
			} else
			if ((!strcmp("device", line->buffer)) && sockfd >= 0) {
				curfd = sockfd;
			} else {
				log_error("> %d: -> unknown channel name %s\n", lineno, line->buffer);
				return 1;
			}
			break;
		}
		curpos++;
	}

	return 0;
}
Example #22
0
static inline int _packets_available(encx24j600_t *dev)
{
    /* return PKTCNT (low byte of ESTAT) */
    return reg_get(dev, ESTAT) & ~0xFF00;
}
Example #23
0
/**
 * returns the status of the execution
 *  0 = normal end
 *  1 = expect mismatch
 */
int execute_script(int sockfd, registry_t *script) {

	// current "pc" pointer to script line
	int curpos = 0;	
	line_t *line = NULL;
	int lineno = 0;

	int err = 0;
	ssize_t size = 0;
	line_t *errmsg = NULL;
	scriptlet_t *scr = NULL;

	while ( (err == 0) && (line = reg_get(script, curpos)) != NULL) {

		lineno = line->num;

		switch (line->cmd) {
		case CMD_COMMENT:
			if (!trace) {
				break;
			}
			// fall-through
		case CMD_MESSAGE:
			log_info("> %s\n", line->buffer);
			break;
		case CMD_ERRMSG:
			errmsg = line;
			break;
		case CMD_SEND:
			for (int i = 0; (scr = reg_get(&line->scriptlets, i)) != NULL; i++) {
				if (scr->exec != NULL) {
					scr->exec(line, scr);
				}
			}
			if (trace) {
				log_hexdump2(line->buffer, line->length, 0, "Send  : ");
			}

			size = write(sockfd, line->buffer, line->length);
			if (size < 0) {
				log_errno("Error writing to socket at line %d\n", lineno);
				err = -1;
			}
			break;
		case CMD_EXPECT:
			line->mask = mem_alloc_c(line->length, "line_mask");
			memset(line->mask, 0xff, line->length);
			for (int i = 0; (scr = reg_get(&line->scriptlets, i)) != NULL; i++) {
				if (scr->exec != NULL) {
					scr->exec(line, scr);
				}
			}
			err = compare_packet(sockfd, line->buffer, line->mask, line->length, lineno);
			mem_free(line->mask);
			line->mask = NULL;

			if (err != 0) {
				if (errmsg != NULL) {
					log_error("> %d: %s -> %d\n", lineno, errmsg->buffer, err);
				}
				return err;
			}
			break;
		case CMD_INIT:
			send_sync(sockfd);
			err = compare_packet(sockfd, line->buffer, NULL, line->length, lineno);
			if (err != 0) {
				if (errmsg != NULL) {
					log_error("> %d: %s -> %d\n", lineno, errmsg->buffer, err);
				}
				return err;
			}
			break;
		}
		curpos++;
	}

	return 0;
}
Example #24
0
static void test_regset(void) {
	reg_setSpecial(rG,255);
	reg_setSpecial(rS,STACK_ADDR);
	reg_setSpecial(rO,STACK_ADDR);

	// first try, which does not change the state at all
	{
		reg_set(254,0x1234);
		reg_push(254);
		test_assertOcta(reg_get(0),0);
		test_assertOcta(reg_getSpecial(rL),0);
		test_assertOcta(reg_getSpecial(rS),STACK_ADDR);
		test_assertOcta(reg_getSpecial(rO),STACK_ADDR + 0x7F8);

		jmp_buf env;
		int ex = setjmp(env);
		if(ex != EX_NONE) {
			test_assertOcta(reg_get(0),0);
			test_assertOcta(reg_getSpecial(rL),0);
			test_assertOcta(reg_getSpecial(rS),STACK_ADDR);
			test_assertOcta(reg_getSpecial(rO),STACK_ADDR + 0x7F8);
		}
		else {
			ex_push(&env);
			reg_set(0,0x5678);
			test_assertFalse(true);
		}
		ex_pop();
		reg_pop(0);
	}

	// second try, which sets a few registers first
	{
		reg_setSpecial(rL,0);
		reg_set(252,0x1234);
		reg_push(252);
		test_assertOcta(reg_get(0),0);
		test_assertOcta(reg_get(1),0);
		test_assertOcta(reg_get(2),0);
		test_assertOcta(reg_getSpecial(rL),0);
		test_assertOcta(reg_getSpecial(rS),STACK_ADDR);
		test_assertOcta(reg_getSpecial(rO),STACK_ADDR + 0x7E8);

		jmp_buf env;
		int ex = setjmp(env);
		if(ex != EX_NONE) {
			test_assertOcta(reg_get(0),0);
			test_assertOcta(reg_get(1),0);
			test_assertOcta(reg_get(2),0);
			test_assertOcta(reg_getSpecial(rL),2);	// has changed
			test_assertOcta(reg_getSpecial(rS),STACK_ADDR);
			test_assertOcta(reg_getSpecial(rO),STACK_ADDR + 0x7E8);
		}
		else {
			ex_push(&env);
			reg_set(2,0x5678);
			test_assertFalse(true);
		}
		ex_pop();
		reg_pop(0);
	}
}
Example #25
0
static sCmdArg eval_doFetchExp(int op,sASTNode *expr,octa offset,bool *finished) {
	sCmdArg e = eval_get(expr,offset * fetchOps[op].width,finished);
	if(e.type != ARGVAL_INT)
		cmds_throwEx("Unsupported operation!\n");

	sCmdArg res;
	res.type = ARGVAL_INT;
	res.origin = ORG_EXPR;
	res.location = e.d.integer & ~(octa)(fetchOps[op].align - 1);
	res.d.integer = 0;
	// don't do anything when we're done because it may cause an error if we've crossed a "border"
	// e.g. sp[31..32]. the last call would be for sp[33]
	if(*finished)
		return res;

	switch(op) {
		case FETCH_VMEM:
			// be carefull with aligning here, therefore byte-access
			res.d.integer = eval_vmReadOcta(res.location);
			res.origin = ORG_VMEM;
			break;
		case FETCH_VMEM1:
			// use the uncached version here because we don't want to change the machine-state (TC)
			res.d.integer = mmu_readByte(res.location,0);
			res.origin = ORG_VMEM1;
			break;
		case FETCH_VMEM2:
			res.d.integer = mmu_readWyde(res.location,0);
			res.origin = ORG_VMEM2;
			break;
		case FETCH_VMEM4:
			res.d.integer = mmu_readTetra(res.location,0);
			res.origin = ORG_VMEM4;
			break;
		case FETCH_VMEM8:
			res.d.integer = mmu_readOcta(res.location,0);
			res.origin = ORG_VMEM8;
			break;
		case FETCH_PMEM:
			res.d.integer = bus_read(res.location,false);
			res.origin = ORG_PMEM;
			break;
		case FETCH_LREG:
			res.d.integer = reg_getLocal(res.location);
			res.origin = ORG_LREG;
			break;
		case FETCH_GREG:
			if(res.location < MAX(256 - GREG_NUM,MIN_GLOBAL))
				cmds_throwEx("The global register %Od does not exist\n",res.location);
			res.d.integer = reg_getGlobal(res.location);
			res.origin = ORG_GREG;
			break;
		case FETCH_SREG:
			if(res.location >= SPECIAL_NUM)
				cmds_throwEx("The special register %Od does not exist\n",res.location);
			res.d.integer = reg_getSpecial(res.location);
			res.origin = ORG_SREG;
			break;
		case FETCH_DREG:
			res.d.integer = reg_get(res.location);
			res.origin = ORG_DREG;
			break;
		default:
			assert(false);
			break;
	}
	if(offset == 0)
		*finished = false;
	return res;
}
Example #26
0
static void test_cswap(void) {
	sInstrArgs iargs;
	reg_setSpecial(rL,0);
	reg_setSpecial(rG,255);

	// arrange things so that reading the memory-location fails
	{
		// PTE 1 for 0x100000000 .. 0x1FFFFFFFF (-wx)
		cache_write(CACHE_DATA,0x400000008,0x0000000400000003,0);
		tc_removeAll(TC_DATA);

		reg_setSpecial(rP,0x1234567890ABCDEF);
		reg_set(10,0x1234);
		mmu_writeOcta(0x100000000,0,MEM_SIDE_EFFECTS);

		jmp_buf env;
		int ex = setjmp(env);
		if(ex != EX_NONE) {
			test_assertOcta(reg_getSpecial(rP),0x1234567890ABCDEF);
			test_assertOcta(reg_get(10),0x1234);
			test_assertOcta(cache_read(CACHE_DATA,0x400000000,MEM_SIDE_EFFECTS),0);
		}
		else {
			ex_push(&env);
			iargs.x = 10;
			iargs.y = 0x100000000;
			iargs.z = 0;
			cpu_instr_cswap(&iargs);
			test_assertFalse(true);
		}
		ex_pop();
	}

	// arrange things so that writing the memory-location fails
	{
		reg_setSpecial(rP,0x1234567890ABCDEF);
		reg_set(10,0x1234);
		mmu_writeOcta(0x100000000,0x1234567890ABCDEF,MEM_SIDE_EFFECTS);

		// PTE 1 for 0x100000000 .. 0x1FFFFFFFF (r-x)
		cache_write(CACHE_DATA,0x400000008,0x0000000400000005,0);
		tc_removeAll(TC_DATA);

		jmp_buf env;
		int ex = setjmp(env);
		if(ex != EX_NONE) {
			test_assertOcta(reg_getSpecial(rP),0x1234567890ABCDEF);
			test_assertOcta(reg_get(10),0x1234);
			test_assertOcta(mmu_readOcta(0x100000000,MEM_SIDE_EFFECTS),0x1234567890ABCDEF);
		}
		else {
			ex_push(&env);
			iargs.x = 10;
			iargs.y = 0x100000000;
			iargs.z = 0;
			cpu_instr_cswap(&iargs);
			test_assertFalse(true);
		}
		ex_pop();
	}

	// arrange things so that setting register X fails
	{
		// PTE 1 for 0x100000000 .. 0x1FFFFFFFF (rwx)
		cache_write(CACHE_DATA,0x400000008,0x0000000400000007,0);
		tc_removeAll(TC_DATA);

		reg_setSpecial(rP,0x1234567890ABCDEF);
		mmu_writeOcta(0x100000000,0x1234567890ABCDEF,MEM_SIDE_EFFECTS);

		// push some registers down
		reg_setSpecial(rO,STACK_ADDR);
		reg_setSpecial(rS,STACK_ADDR);
		reg_set(254,0x1234);
		reg_push(254);

		jmp_buf env;
		int ex = setjmp(env);
		if(ex != EX_NONE) {
			test_assertOcta(reg_getSpecial(rP),0x1234567890ABCDEF);
			test_assertOcta(reg_getSpecial(rL),0);
			test_assertOcta(mmu_readOcta(0x100000000,MEM_SIDE_EFFECTS),0x1234567890ABCDEF);
		}
		else {
			ex_push(&env);
			iargs.x = 10;
			iargs.y = 0x100000000;
			iargs.z = 0;
			cpu_instr_cswap(&iargs);
			test_assertFalse(true);
		}
		ex_pop();
	}
}
Example #27
0
/* Read global stats */
static int ioctl_stats(void *user_addr)
{
	struct pme_ctrl_stats stats;
	if (copy_from_user(&stats, user_addr, sizeof(stats)))
		return -EFAULT;
	if (stats.flags & PME_CTRL_STNIB)
		stats.stnib = reg_get(regs, STNIB);
	if (stats.flags & PME_CTRL_STNIS)
		stats.stnis = reg_get(regs, STNIS);
	if (stats.flags & PME_CTRL_STNTH1)
		stats.stnth1 = reg_get(regs, STNTH1);
	if (stats.flags & PME_CTRL_STNTH2)
		stats.stnth2 = reg_get(regs, STNTH2);
	if (stats.flags & PME_CTRL_STNTHL)
		stats.stnthl = reg_get(regs, STNTHL);
	if (stats.flags & PME_CTRL_STNCH)
		stats.stnch = reg_get(regs, STNCH);
	if (stats.flags & PME_CTRL_STNPM)
		stats.stnpm = reg_get(regs, STNPM);
	if (stats.flags & PME_CTRL_STNS1M)
		stats.stns1m = reg_get(regs, STNS1M);
	if (stats.flags & PME_CTRL_STNPMR)
		stats.stnpmr = reg_get(regs, STNPMR);
	if (stats.flags & PME_CTRL_STNDSR)
		stats.stndsr = reg_get(regs, STNDSR);
	if (stats.flags & PME_CTRL_STNESR)
		stats.stnesr = reg_get(regs, STNESR);
	if (stats.flags & PME_CTRL_STNS1R)
		stats.stns1r = reg_get(regs, STNS1R);
	if (stats.flags & PME_CTRL_STNOB)
		stats.stnob = reg_get(regs, STNOB);
	if (stats.flags & PME_CTRL_STDBC)
		stats.stdbc = reg_get(regs, STDBC);
	if (stats.flags & PME_CTRL_STDBP)
		stats.stdbp = reg_get(regs, STDBP);
	if (stats.flags & PME_CTRL_STDWC)
		stats.stdwc = reg_get(regs, STDWC);
	if (stats.flags & PME_CTRL_MIA_BYC)
		stats.mia_byc = reg_get(regs, MIA_BYC);
	if (stats.flags & PME_CTRL_MIA_BLC)
		stats.mia_blc = reg_get(regs, MIA_BLC);
	if (stats.flags & PME_CTRL_MIA_LSHC0)
		stats.mia_lshc0 = reg_get(regs, MIA_LSHC0);
	if (stats.flags & PME_CTRL_MIA_LSHC1)
		stats.mia_lshc1 = reg_get(regs, MIA_LSHC1);
	if (stats.flags & PME_CTRL_MIA_LSHC2)
		stats.mia_lshc2 = reg_get(regs, MIA_LSHC2);
	if (stats.flags & PME_CTRL_MIA_CWC0)
		stats.mia_cwc0 = reg_get(regs, MIA_CWC0);
	if (stats.flags & PME_CTRL_MIA_CWC1)
		stats.mia_cwc1 = reg_get(regs, MIA_CWC1);
	if (stats.flags & PME_CTRL_MIA_CWC2)
		stats.mia_cwc2 = reg_get(regs, MIA_CWC2);
	if (stats.flags & PME_CTRL_STNTHS)
		stats.stnths = reg_get(regs, STNTHS);
	stats.overflow = reg_get(regs, SCOS) & stats.flags;
	/* Write-to-clear the overflow bits. Those stats that have been read
	 * have already been reset so it's necessary to do likewise with the
	 * overflow bits. NB, we have sleep interfaces available to allow an
	 * application to check the stats "often", however there's always a
	 * theoretical possibility for wrap-arounds to occur and thus give us
	 * "race" potentials between the stats and their overflow bits (there
	 * is no way to read them together atomically. We read/reset overflow
	 * bits after the stats to give us the least-worst combination. */
	reg_set(regs, SCOS, stats.overflow);
	if (copy_to_user(user_addr, &stats, sizeof(stats)))
		return -EFAULT;
	return 0;
}