/*
 reset -- A program to reset a WRAP board
 Copyright (C) 2005 Michael Hanselmann

 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
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.

 This program 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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <asm/io.h>
#include <sys/io.h>

int main(int argc, char* argv[]) {
    /* Check wether the user really wants to reset */
    if(!(argc == 2 && !strcmp(argv[1], "-YES"))) {
        printf("Usage to reset: %s -YES\n", argv[0]);
        exit(1);
    }

    /* Get root permissions (when setuid-root) */
    setuid(0);
    seteuid(0);

    /* Get permissions for direct I/O */
    if(iopl(3)) {
        perror("iopl");
        exit(1);
    }

    puts("Goodbye!");

    /* reset control (data sheet SC1100, version 2.0, page 178) */
    outl(0x80009044, 0xCF8);

    /* system wide reset */
    outl(0xF, 0xCFC);

    /* Should never be reached */
    return 0;
}
