示例#1
0
void machine_restart(char *command)
{
	if ((!in_interrupt() && !in_atomic()) || oops_in_progress)
		/*
		 * Only unblank the console if we are called in enabled
		 * context or a bust_spinlocks cleared the way for us.
		 */
		console_unblank();
	_machine_restart(command);
}
示例#2
0
文件: reset.c 项目: 0-T-0/ps4-linux
void machine_restart(char *command)
{
	if (_machine_restart)
		_machine_restart(command);

#ifdef CONFIG_SMP
	preempt_disable();
	smp_send_stop();
#endif
	do_kernel_restart(command);
	mdelay(1000);
	pr_emerg("Reboot failed -- System halted\n");
	local_irq_disable();
	while (1);
}
示例#3
0
long gioctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    struct vm_area_struct *vma;
#ifdef CONFIG_TIVO_DEVEL
    extern void sw_watchdog_threads_hold(void);
    extern void sw_watchdog_threads_release(void);
#endif
    if (!arg)
    {
        printk(KERN_ERR "[gen_ioctl] Invalid arg\n");
        return -EINVAL;
    }

    if (_IOC_TYPE(cmd) != GIOCTL_IOC_MAGIC)
    {
        printk(KERN_ERR "[gen_ioctl] cmd (0x%x) mismatch, " "called with 0x%x while expecting 0x%x\n", cmd, _IOC_TYPE(cmd),
               GIOCTL_IOC_MAGIC);
        return -EINVAL;
    }

    switch (cmd)
    {
#ifdef CONFIG_TIVO_MOJAVE
        case GO_BIST:
        {
                extern void emergency_sync(void);
                extern void _machine_restart(void);
                extern unsigned long get_RAM_size();
                unsigned long *p = (unsigned long *) (KSEG1+get_RAM_size()-PAGE_SIZE);

                /*
                 * flush all disk buffers
                 */ 
                emergency_sync();

                /*Disable Interrupts*/
                local_irq_disable();

                memset(p,0,PAGE_SIZE);
                *p++ = 0x42495354; /*BIST*/
                *p++ = 1; /*Version*/
                strcpy(p, arg); /*Boot Parameters*/
                
                _machine_restart();
                
        }
#endif
        case CRASHALLASSRT:
            return tivocrashallassert(arg);

#ifdef CONFIG_TICK_KILLER
        case TICK_KILLER:
            return tick_killer_start(arg);
#endif

        case UPDATE_EXEC_CTX:
            /*Ineffective ioctl. Handling for the backward compatibility purposes.
             * Has be removed.*/
            return 0;

#ifdef CONFIG_KSTACK_GUARD
        case TEST_KSTACK_GUARD:
            test_kstack_guard_check(current);
            return 0;
#endif
        case TEST_SGAT_DIO:
        {
            struct sgat_dio_fops gfops;
            sgat_dio_req dio_req;
            int c;
            int k = 'z';
            struct scatterlist *p;

            sgat_dio_get_default_fops(&gfops);

            if (sgat_dio_init_req(&gfops, &dio_req, (sgat_dio_hdr_t *) arg))
            {
                printk("Error: sgat_dio_init_req\n");
                return -EINVAL;
            }

            if (sgat_dio_build_sg_list(&gfops, &dio_req, 1))
            {
                printk("Error: sgat_dio_build_sg_list\n");
                return -EINVAL;
            }

            p = (struct scatterlist *)dio_req.sclist;
            for (c = 0; c < dio_req.k_useg; c++)
            {
                memset(p->address, k, p->length);
                p++;
            }
            sgat_dio_exit_req(&gfops, &dio_req, 1);
            return 0;
        }
#ifdef CONFIG_TIVO_SATA_HOTPLUG
        case SATA_UNPLUG_INT:
        {
            /* This is a blocking call */
            int port, offset, regvalue;

            port = 1;                            /* Currently hard coding to port 1 */

            if (port >= NUM_SATA_PORTS)
                return -EINVAL;

            /* SATA STATUS port */
            offset = MMIO_SATA_STATUS + port * PORT_OFFSET;

            /* Check the status */
            regvalue = mmio_inl(offset);
            regvalue &= PHY_IN_BIST;

            if (regvalue)
                return 0;

            /* If user request for non blocking */
            if (arg & 0x2)
            {
                /* Any positive number is treated error output of command (not ioctl error).
                 */
                return 1;
            }

            /* Now we have to wait for interrupt */
            //return sata_wait_for_IRQ(port, offset, PHY_IN_BIST);
            return 1;

        }

        case SATA_PLUG_INT:
        {
            /* This is a blocking call */
            int port, offset, regvalue;

            port = 1;                            /* Currently hard coding to port 1 */

            if (port >= NUM_SATA_PORTS)
                return -EINVAL;

            /* SATA STATUS port */
            offset = MMIO_SATA_STATUS + port * PORT_OFFSET;

            /* Check the status */
            regvalue = mmio_inl(offset);
            regvalue &= PHY_IS_RDY;

            if (regvalue)
                return 0;

            /* If user request for non blocking */
            if (arg & 0x2)
            {
                /* Any positive number is treated error output of command (not ioctl error).
                 */
                return 1;
            }
            /* Now we have to wait for interrupt */
            //return sata_wait_for_irq(port, offset, PHY_IS_RDY);
            return 1;
        }
#endif
        case LOCKMEM:
        {
             printk("Pretending to LOCKMEM %p\n", (void *)arg);
            //struct iovec *iovec = (struct iovec *) arg;
            //if ( pindown_pages(NULL, iovec, 1, 1, WRITE) )
            //    return -EINVAL;
            return 0;
        }
        
        case UNLOCKMEM:
        {
            printk("Pretending to UNLOCKMEM %p\n", (void *)arg);
            // struct iovec *iovec = (struct iovec *) arg;
            // struct page **page_list;
            // struct page **pg_list;
            // unsigned int pg_addr;
            // int pgcount,pg;

            // pgcount = (((u_long)iovec->iov_base) + 
            //     iovec->iov_len + PAGE_SIZE - 1)/PAGE_SIZE - 
            //     ((u_long)iovec->iov_base)/PAGE_SIZE;
            // pg_addr = (unsigned int )(iovec->iov_base) & (~(PAGE_SIZE-1));
            // page_list = kmalloc(sizeof(struct page **) * pgcount, GFP_KERNEL);
            // pg_list = page_list;
            // for ( pg = 0; pg < pgcount; pg++){
            //     *(pg_list++) = virt_to_page(pg_addr);
            //     pg_addr += PAGE_SIZE;
            // }
            // unlock_pages(page_list);
            // kfree(*page_list);
            return 0;
        }

        case IS_PM_FWUPGD_REQD:
        {
            int ret = -EINVAL;
#if SKIP_SATA_PM_FW_UPGD
            return -EACCES;
#endif
#ifdef CONFIG_TIVO_DEVEL
            /* Turn off sw watchdog for a while */
            sw_watchdog_threads_hold();
#endif
            if (is_fw_upgd_reqd)
                ret = is_fw_upgd_reqd();
#ifdef CONFIG_TIVO_DEVEL
            sw_watchdog_threads_release();
#endif
            return ret;
        }

        case DWNLD_SATA_PM_FW:
        {
            int ret = -EINVAL;
#if SKIP_SATA_PM_FW_UPGD
            return -EACCES;
#endif
#ifdef CONFIG_TIVO_DEVEL
            /* Turn off sw watchdog for a while until we complete
             * upgrading FW in blocking PIO mode
             */
            sw_watchdog_threads_hold();
#endif
            if (upgd_fw_init)
                ret = upgd_fw_init();
#ifdef CONFIG_TIVO_DEVEL
            /*Trun on sw wdog */
            sw_watchdog_threads_release();
#endif
            return ret;
        }

        case GET_VMA_INFO:
        {
            struct vma_info_struct s;
            
            copy_from_user(&s,(void *)arg,sizeof(s));

            down_read(&current->mm->mmap_sem);
            vma = find_vma(current->mm, s.address);
            
            if (!vma || vma->vm_start > s.address)
            {
                up_read(&current->mm->mmap_sem);
                return -ENOMEM;
            }    

            s.start = vma->vm_start;
            s.end = vma->vm_end-1;
            s.read = (vma->vm_flags & VM_READ)!=0;
            s.write = (vma->vm_flags & VM_WRITE)!=0;
            s.exec = (vma->vm_flags & VM_EXEC)!=0;
            s.shared = (vma->vm_flags & VM_SHARED)!=0;
            s.offset = vma->vm_pgoff*PAGE_SIZE;
            s.device=s.inode=0;
            if (vma->vm_file)
            {
                s.device=vma->vm_file->f_dentry->d_inode->i_rdev;
                s.inode=vma->vm_file->f_dentry->d_inode->i_ino;
            } 
            
            up_read(&current->mm->mmap_sem);
            copy_to_user((void *)arg, &s, sizeof(s));
            return 0;
        }

    }

    // none of the above...
    printk(KERN_ERR "gen_ioctl: Invalid command (0x%x)\n",cmd);
    return -EINVAL;
}
示例#4
0
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	_machine_restart();

	return 0;
}
示例#5
0
void machine_restart(char *command)
{
	_machine_restart(command);
}
示例#6
0
void machine_restart(char *command)
{
	if (_machine_restart)
		_machine_restart(command);
}