/* Declarations common the the C portions of the QEMU PALcode console. Copyright (C) 2011 Richard Henderson This file is part of QEMU PALcode. 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 text of the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not see . */ #ifndef PROTOS_H #define PROTOS_H 1 #include #include #include #include /* * Call_Pal functions. */ static inline void wrent(void *cb, unsigned long which) { register void *a0 __asm__("$16") = cb; register unsigned long a1 __asm__("$17") = which; asm volatile ("call_pal 0x34" : "+r"(a0), "+r"(a1) : : "$1", "$22", "$23", "$24", "$25"); } static inline unsigned long swpipl(unsigned long newipl) { register unsigned long v0 __asm__("$0"); register unsigned long a0 __asm__("$16") = newipl; asm volatile ("call_pal 0x35" : "=r"(v0), "+r"(a0) : : "$1", "$22", "$23", "$24", "$25"); return v0; } static inline unsigned long rdps(void) { register unsigned long v0 __asm__("$0"); asm volatile ("call_pal 0x36" : "=r"(v0) : : "$1", "$22", "$23", "$24", "$25"); return v0; } static inline void wrkgp(void) { asm volatile ("mov $29, $16\n\tcall_pal 0x37" : : : "$16", "$1", "$22", "$23", "$24", "$25"); } static inline unsigned long wtint(unsigned long skip) { register unsigned long v0 __asm__("$0"); register unsigned long a0 __asm__("$16") = skip; asm volatile ("call_pal 0x3e" : "=r"(v0), "+r"(a0) : : "$1", "$22", "$23", "$24", "$25"); return v0; } /* * Cserve functions. */ static inline unsigned long ldq_p(unsigned long addr) { register unsigned long v0 __asm__("$0"); register unsigned long a0 __asm__("$16") = 1; register unsigned long a1 __asm__("$17") = addr; asm volatile ("call_pal 9" : "=r"(v0), "+r"(a0), "+r"(a1) : : "$18", "$19", "$20", "$21"); return v0; } static inline unsigned long stq_p(unsigned long port, unsigned long val) { register unsigned long v0 __asm__("$0"); register unsigned long a0 __asm__("$16") = 2; register unsigned long a1 __asm__("$17") = port; register unsigned long a2 __asm__("$18") = val; asm volatile ("call_pal 9" : "=r"(v0), "+r"(a0), "+r"(a1), "+r"(a2) : : "$19", "$20", "$21"); return v0; } static inline unsigned long get_wall_time(void) { register unsigned long v0 __asm__("$0"); register unsigned long a0 __asm__("$16") = 3; asm("call_pal 9" : "=r"(v0), "+r"(a0) : : "$17", "$18", "$19", "$20", "$21"); return v0; } static inline unsigned long get_alarm(void) { register unsigned long v0 __asm__("$0"); register unsigned long a0 __asm__("$16") = 4; asm("call_pal 9" : "=r"(v0), "+r"(a0) : : "$17", "$18", "$19", "$20", "$21"); return v0; } static inline void set_alarm_rel(unsigned long nsec) { register unsigned long a0 __asm__("$16") = 5; register unsigned long a1 __asm__("$17") = nsec; asm volatile ("call_pal 9" : "+r"(a0), "+r"(a1) : : "$0", "$18", "$19", "$20", "$21"); } static inline void set_alarm_abs(unsigned long nsec) { register unsigned long a0 __asm__("$16") = 6; register unsigned long a1 __asm__("$17") = nsec; asm volatile ("call_pal 9" : "+r"(a0), "+r"(a1) : : "$0", "$18", "$19", "$20", "$21"); } /* * I/O functions */ extern void *pci_io_base; extern void *pci_mem_base; static inline uint8_t inb(unsigned long port) { return *(volatile uint8_t *)(pci_io_base + port); } static inline uint16_t inw(unsigned long port) { return *(volatile uint16_t *)(pci_io_base + port); } static inline uint32_t inl(unsigned long port) { return *(volatile uint32_t *)(pci_io_base + port); } static inline void outb(uint8_t val, unsigned long port) { *(volatile uint8_t *)(pci_io_base + port) = val; } static inline void outw(uint16_t val, unsigned long port) { *(volatile uint16_t *)(pci_io_base + port) = val; } static inline void outl(uint32_t val, unsigned long port) { *(volatile uint32_t *)(pci_io_base + port) = val; } /* * CRB functions */ extern unsigned long crb_dispatch(long select, long a1, long a2, long a3, long a4); extern unsigned long crb_fixup(unsigned long vptptr, unsigned long hwrpb); /* * The Console */ extern bool have_vga; extern void do_console(void); extern void entInt(void); /* * Utils */ extern int printf(const char *, ...); extern void ndelay(unsigned long nsec); static inline void udelay(unsigned long msec) { ndelay(msec * 1000); } /* * Initialization */ extern void ps2port_setup(void); extern void pci_setup(void); extern void vgahw_init(void); #endif /* PROTOS_H */