I/O simulation

Abstract: The system and method of this invention allows a simulated processor to receive an interrupt request from I/O devices. A simulated interrupt controller routine determines whether to post an interrupt to the simulated CPU. The simulated interrupt controller routine posts an interrupt to the simulated CPU by updating one byte, which is owned by the simulated interrupt controller, of a two byte halfword. The other byte is owned by the simulated CPU and is updated by the simulated CPU when its internal interrupt enabled state changes. Each byte of the two byte halfword is updated independently, but is loaded by the simulated CPU with only one instruction to determine if an interrupt should be acknowledged. The simulated CPU minimises the overhead of polling for an interrupt by performing a graph analysis of the instruction flow of control to determine the locations to poll for interrupts. The simulated CPU polls for an interrupt when an instruction transfers control dynamically, once around a loop, and when an instruction changes the interrupt enabled state of the simulated CPU.

Description: This invention relates to I/O simulation in data processing systems running applications written for the specific first processor of the first processing system having input/output devices but running on a second processing system having a second dissimilar processor which has the input/output devices of the first processing system attached thereto. Current advances in computer technology have lead to ever changing processors, otherwise referred to herein as the central processing unit (CPU), of the processing system. Examples of the evolution of various processors are Intel's 8088 processor used in the IBM PC, Intel's 80286 processor used in the IBM PC AT, Intel's 80386 processor used in the IBM Personal System/2 model 80, and the IBM Research/ OPD Microprocessor (ROMP) which uses a Reduced Instruction Set Computer (RISC) architecture in the IBM RT PC. Other processors include Motorola's 68000, 68020 among others. The hardware of various processing systems changes rapidly to take advantage of the increased processing power of emerging processors. A disadvantage of changing hardware is that the software written for previous processors typically can not be used on the later hardware technology. In some cases where it can be used on a different processing system other than the one it was originally written for, the performance of the application is not as good on the different processing system as it would have been on the processing system for which the application was originally written. As a result, software applications which may have had a long development cycle may become quickly obsolete. The demise of the earlier written software is all the more tragic when the function of the application as originally written is still very much pertinent and in demand on the new hardware processing systems. As a result, there is typically only a limited amount of "new" software available that is specifically written for the "new" hardware design when the new hardware is initially released into the market place. This is due in part by the long development cycle of creating software application programs, and the confidentiality of the new hardware design by the manufacturer prior to releasing the hardware into the market place. The software manufacturer has to know certain facts about the hardware of a processing system before a software application program can be written for the processing system. Ideally, a manufacturer of processing systems would like to have a vast amount of software available to run on the processing system as soon as the new hardware for the processing system is announced into the market place. A customer would more likely invest in a new processing system if the customer knows that an abundant supply of software is already available for use. There have been several approaches in tapping the vast amount of software that has previously been written for "older" hardware designs. A previous hardware approach for being able to run applications originally written for another processor is to build the new processing system with a coprocessor. In this way, the processing system can run applications for both types of processors, the new processor and the old processor. For example, the IBM RT PC contained an IBM PC AT coprocessor in order to use applications that were originally written for the IBM PC AT. However, since the coprocessor was supported at a low level in the operating system, the coprocessor could not take full advantage of the functions provided by the AIX operating system. One of the functions provided by the AIX operating system is multi-tasking as described in co-pending EP-A-0 229 336. The coprocessor, however, limits the user to one session at a time, since the coprocessor included a hardware adapter for emulating the PC AT. In other words, once the coprocessor was started, no other instances of the coprocessor could be running. The coprocessor is also limited to the speed of the processor of the first processing system and cannot take advantage of faster second processing systems as they evolve. A second approach is to simulate the second processor through software. A software simulator provides a mechanism to run previously written software for one processor on a new processing system having a different processor. A software approach to simulation allows taking advantage of faster second processing systems as they evolve. It allows the use of multitasking capabilities of the operating system to provide multiple instances of the first processor. Some software simulators on the market today include SoftPC, by Insignia Solutions, and the Amiga Transformer by Simile Research Inc. for Commodore's Amiga (based on Motorola's 68000). Information on this system was published in the article "Amiga's Trump Card: IBM PC Emulation", AMIGA WORLD , Vol. 1, No. 2, November/December 1985. Phoenix Technologies also provided a simulator to simulate the Intel processor for the Apollo machine which has a Motorola 68000 processor. Any specific CPU processor has a specific instruction set. When a software application program is developed for a specific CPU processor, it is compiled into object code. The object code is targeted to run on any CPU that supports the specific instruction set. A simulator takes object code that was written to run on a specific instruction set, and converts it to run on a different processor which may have a similar or different instruction set. The more the two instruction sets of the two processors are different, the more difficult it is to simulate the other processor. For example, the Intel 80286 processor has a very rich instruction set in that it provides a wide variety of instructions. Each instruction is tailored specifically for a particular type of situation. Additionally each instruction may be able to do several operations. In contrast, the ROMP processor in the RT PC has a reduced instruction set (RISC) processor which provides fewer instructions and less function per instruction. As each instruction in the Intel 80286 may be able to do several tasks, more instructions would be required with the ROMP RISC processor to accomplish the same tasks. However, the speed of a processor can be increased by simplifying the instruction set. Although more instructions are required, no additional time is consumed on complicated instructions while executing the more common and simpler tasks. Previous methods of software simulators created a subroutine that would simulate the effect of an instruction. Every time the machine being simulated needed to run that instruction, the subroutine would be called in order to decode and execute that instruction. The problem with this approach is that the overhead of decoding the instruction occurs every time the subroutine is called and executed. Consequently, the speed of the simulated processor is affected. Instead of calling a subroutine each time an instruction needed to be executed, another software simulation approach compiled a shorter sequence of host machine instructions to simulate an instruction. As a result, the overhead of decoding and translating the instruction occurs only once, during the first time the instruction is encountered. This translation is then saved. From then on, every time that instruction is simulated, the translation is executed. This is often referred to as a second generation simulator. A first generation simulator will take an instruction one at a time and decode it in real time and execute it. The decoding is done for each instruction as each instruction is needed. A second generation simulator will go through the instructions one at a time, translate the instructions, and then reuse that translation instead of going back and translating again. A previous second generation simulator was the simulator that simulated the ROMP CPU on the IBM System/370 called RSIM. This simulator reserves a fixed amount of storage for each instruction (16 bytes for every halfword) called cells. IBM 370 instructions would then be generated for each one of these cells for each RT instruction. If the amount of code generated is less than what would fit in one cell, which is usually the case, then it branches to the next boundary of the next cell. If the amount of code generated to simulate the instruction can not fit into one cell, then a subroutine call is generated that branches to a run time environment set of routines which perform the emulation and return back to the cell to complete execution. Another simulator simulates the processor of the IBM System/370 on the IBM RT PC which is described in the following article: May, C., "Mimic: A Fast System/370 Simulator", presented June 11, 1987 at the Association of Computing Machinery Symposium on Interpreters and Interpretive Techniques", and published in SIGPLAN , 1987 proceedings of ACM. A first generation simulator runs 50 to 100 host machine instructions per simulated instruction. A second generation simulator runs an average of 10 host machine instructions per simulated instruction. If a simulator takes either 50 or 10 instructions to simulate one instruction on the simulated machine, the second processor running the simulator must be either 50 or 10 times as fast respectively as the simulated machine to be comparable in performance. It is therefore desirable to further reduce the number of simulator instructions per each simulated or translated instruction than what has previously been accomplished in the art. For example, if a simulator could be designed to use only 4 instructions per simulated instruction, and the simulator processor is more than 4 times faster than the simulated machine processor, the simulator will be faster than the original machine being simulated. A user would then observe increased performance by using the simulated machine to run an application program than by using the machine for which the application program was originally written. Therefore, the overall problem to overcome in simulating another processor is to further reduce the number of simulator (host) instructions per simulated instruction in order to increase the processing speed of the simulator. However, if an application program which was written for a different processing system is to be executed, there is more than just the CPU processor that needs to be simulated efficiently. One major area in simulating a different processing system involves simulating accurately and efficiently the various aspects of the I/O of the first processing system while also simulating the processor of that first processing system. It is important not to degrade the performance of the CPU simulator while simulating I/O devices attached to the processing system. This is especially true when attempting to simulate an interrupt from an I/O device. One major problem in using a software simulated CPU is in getting hardware interrupts from a physical adapter to the software simulated CPU without degrading its performance. According to the present invention, there is provided a method of simulating interrupt requests from an I/O device to a simulated processor, in a data processing system including a first hardware processor and at least one hardware I/O device, the system running an application program on a simulation of a second hardware processor for which the application program was written, which second hardware processor is different from said first hardware processor, characterised in that the method includes: analyzing a representation of the instruction flow of control of the application program as a graph to identify blocks of first processor instructions suitable for translation together into second processor instructions, thereby determining when in the instruction flow to poll for interrupts. The present invention also provides a data processing system including a hardware processor and at least one hardware I/O device running an application written for a different hardware processor on a simulation of that processor, including, in order to simulate interrupt requests from the I/O device to the simulated processor: means for representing the instruction flow of control of the application program as a graph; means for analyzing the representation as a graph to determine when to poll for interrupts by determining when an instruction transfers control dynamically in the application program; and means for polling for an interrupt. As disclosed hereinafter in an embodiment of the present invention, such an arrangement reduces the average host machine instructions per simulated machine instruction while responding to interrupts presented by an I/O adapter on the processing system in a timely fashion without degrading performance of the simulator. A path is provided for the simulator to have direct control of the hardware. Several techniques were developed in order to accurately simulate the I/O of one processing system on a simulated processor of another processing system. First, a technique was needed to simulate a typical hardware interrupt mechanism of a first processing system in order for the simulated CPU to recognise and service a hardware interrupt from an adapter. The disclosed simulated interrupt controller routine achieves this. Although the Intel 80286 processor, which is being simulated in the preferred embodiment of this invention, cannot be interrupted as it is executing an instruction, the interrupt can come in and be recognised and serviced after each instruction. On a processing system simulator, it would be very time consuming to look for an interrupt after each instruction is executed, and then service the interrupt if the interrupt were pending. The number of times an interrupt is polled by the simulated CPU is minimised, while still guaranteeing the interrupts to be recognised in a timely fashion. Instead of checking for interrupts after each instruction, they are checked after a block of code (i.e. instructions). The blocks of instructions are defined by a technique previously applied to compiler technology, and now applied to I/O simulation. A graph analysis of the processor's flow of instruction control for the application program is used to determine blocks of first processor instructions that can be easily and readily translated together into several second processor instructions. After the end of a block of instructions, the simulated interrupt controller is checked to verify whether an interrupt is pending. In addition, the CPU simulator has to guarantee that it will recognise an interrupt in a timely fashion to be responsive to the I/O devices. This means that it will have to poll for this interrupt at regular intervals in order to determine whether an interrupt is coming in. To guarantee this, the disclosed simulator of this invention checks for interrupts when it detects, at the time it translates a block of instructions from the graph analysis, a possibility of a loop occurring in the program. A loop is an instruction that branches back to a place where it has already been before, and there is a path back to the branching instruction. Since it cannot be determined how long the simulator will be executing in the loop, it is guaranteed that every time around the loop the simulator will look for an interrupt. The processor will recognise an interrupt when two conditions are true. One is when there is an interrupt being requested, in this case from the interrupt controller. The other is when internally the processor is able to service the interrupt. In order for a simulator to recognise an interrupt, when both of these conditions are true, and to minimise the overhead in detecting an interrupt, the simulator polls a halfword, which is two bytes of memory, with a single Load Half word instruction. Each of the bytes of the halfword has a separate meaning. One byte indicates whether the processor is currently enabled to service interrupts. This byte is only updated by the simulated processor. The other byte indicates whether an interrupt is being requested. This byte only gets updated by the simulated interrupt controller. If both bytes are zero, it means that the processor is enabled for interrupts and that an interrupt is being requested. These two conditions can be updated separately, and yet checked simultaneously by a single instruction. The present invention will be described further by way of example with reference to an embodiment thereof as illustrated in the accompanying drawing, in which' Fig. 1 is a block diagram showing the processing system environment; Fig. 2 is a flow chart showing the initial steps in starting the simulation; Fig. 3 is a graph analysis of a sample flow of control of first processor instructions that are to be translated; Fig. 4 is a flow diagram of the translation by the CPU simulator; Fig. 5 is a block diagram showing a simulated processor receiving interrupts from I/O devices; Fig. 6 is a flow diagram showing the method for a simulated processor to receive interrupts from I/O devices; Fig. 7 illustrates the location for polling for interrupts in a first processor instruction flow of control to minimise the overhead in polling for interrupts; and Fig. 8 illustrates translated instructions used to enable interrupts in the simulated processor. In the disclosed preferred embodiment of this invention, the IBM RT PC simulates the IBM PC AT. An advantage of this preferred embodiment is that both the RT PC and the PC AT have an equivalent bus that allows adapters that were made for the PC AT to be used in the RT PC, if the system has the software to drive the adapters. To simulate a processing system that had a different bus, a virtual interface would have to be written to the hardware. In the present invention, there is direct interface to the hardware. For example, in the preferred embodiment of this invention, a music card designed for the PC AT can be connected to the RT PC. Even though there is no native software for the RT that will drive the music card, the software that was written for the music card on the PC AT could be used on the RT PC by using the simulator of this invention. For more information on the RT PC processing system, the IBM PC AT processing system, and Intel's 80286 processor, the following references are suggested, and are hereby incorporated by reference. Bach, M. J. The Design of the UNIX Operating System , Prentice Hall, 1986. Lang, T. G. and Mothersole, T. L., Design of the RT PC VRM Nucleus , September 1, 1986. AIX Operating System Commands Reference , Version 2.1, IBM Corporation, SC23-0790. AIX Operating System Managing the AIX Operating System , Version 2.1, IBM Corporation, SC23-0793. AIX Operating System Programming Tools and Interfaces , Version 2.1, IBM Corporation, SC23-0789. AIX Operating System Technical Reference , Version 2.1, Volumes 1 and 2, IBM Corporation, SC23-0808 and SC23-0809. IBM RT Personal Computer Technology , IBM Corporation, SA23-1057, 1986. Virtual Resource Manager Technical Reference , Version 2.1, Volumes 1 and 2, IBM Corporation, SC23-0816 and SC23-0817. iAPX 8286 Programmer's Reference Manual Including the iAPX 286 Numeric Supplement , Intel, 210498-003, 1985. IBM PC AT Technical Reference Manual , IBM Corporation, March 1984. 8259A Programmable Interrupt Controller 8259A/8259A-2/8259A-8 , Intel, order number 231468-001, October, 1986. As shown in Fig. 1, the simulator 10 runs as an application program on the operating system 12 of the processing system 1. Referring to Fig. 2 in addition to Fig. 1, as the simulator 10 is started, step 2, the simulator 10 copies BIOS 13 containing 80286 instructions from read only storage (ROS) 15, otherwise referred to as read only memory (ROM), into the operating system's 12 shared memory segment 16, step 3. The simulator 10 translates the BIOS 13, step 4, which loads the operating system (DOS) 18 for which the application 19 was originally written, step 5. The simulator 10 then translates and executes that operating system 18, step 6. A user invokes the application 19 at the operating system prompt, step 7, and the simulator 10 translates and executes the application program 19, step 8. I. Interrupt Mechanism In the preferred embodiment of this invention Fig. 5, a simulated interrupt controller routine 300 simulates the functions of a hardware interrupt mechanism, such as the Intel 8259, in order for a simulated CPU 10 to recognise and service a hardware interrupt from an adapter 310. The CPU simulator 10 can only receive one interrupt at a time since it is simulating the 286 processor which only allows one interrupt request to come in. In a first processing system having a 286 processor, which the preferred embodiment of this invention is simulating, a hardware interrupt controller, called the 8259, was used to allow the 286 processor to receive only one interrupt, although 15 different levels of interrupts could be connected to internal adapters, such as the internal timer clock, or to external adapters, such as a communications card attached to the bus. In order to prioritise these interrupts, the first processing system actually used two 8259 interrupt controllers with one cascaded into the other. Each of the interrupt controllers can receive eight inputs and prioritise them to one output. One interrupt controller receives eight interrupts from external or internal adapters, and prioritises them into one output. The other interrupt controller receives this one output as one of the interrupts along with seven other possible interrupts from external or internal devices. Additional information on this controller can be found in 8259A Programmable Interrupt Controller 8259A/8259A-2/8259A-8 , Intel, order number 231468-001, October, 1986, which is herein incorporated by reference. The function of the above hardware interrupt controller is emulated in the system of this invention in the simulated interrupt controller routine 300 (Fig. 5) by using the above reference with standard programming skills known in the art. The simulated interrupt controller routine 300 is located in a shared memory segment 16 (Fig. 5) which allows applications and other processes 10, 9, and device drivers 320 (functioning as interrupt handlers) access to the emulated functions of the interrupt controller. The simulated interrupt controller routine 300 was written to be re-entrant in order for the routines to be called without synchronisation by other processes. Fig. 5 illustrates the preferred embodiment used by this invention to present actual hardware interrupts 315, 316, 317 to the CPU simulator 10, which is an application running on the operating system 12. First, a virtual resource manager (VRM) device driver 320-322 for each of the I/O devices 310-312 was installed in the virtual resource manager 14 to actually receive the hardware interrupts 315-317 from the hardware bus. Because a VRM device driver 320-322 was added, an AIX operating system device driver 237 was needed at the AIX operating system 12 Kernel. The simulator 10 issues an OPEN command 221 to the operating system device driver 237 which does an attach 222 to the two types of device drivers 323, 320. The VRM device driver 323 is responsible for sending timer interrupts to the simulator 10. The capability of timer interrupts were needed at a granularity of less than one second. Timer interrupts of only one second are available at the AIX operating system level 12. However, at the VRM level 14, timer interrupts can be sent approximately every millisecond. Therefore, a VRM device driver 323 was used to present timer interrupts to the simulator 10. The timer interrupt device driver 323 makes a call that sets a timer to receive periodic interrupts from the VRM 14. Each time a timer interrupt is received by the device driver 323 from the VRM 14, the device driver 323 calls the same interrupt controller simulation routine 300 to request an interrupt that the generic device driver 320 does when it receives an interrupt from the hardware 310. In this way, both timer interrupts 318 and hardware interrupts 319 can be sent to the simulator 10 which is running at the application level. Fig. 6 illustrates the steps used by the system Fig. 5 of this invention to present actual hardware interrupts 315, 316, 317 to the CPU simulator 10. When an adapter 310 such as a 3278/3279 emulation card sends a hardware interrupt, it is received by an interrupt handler in the device driver 320, steps 341 and 342. Once the device driver 320 recognises the interrupt 315, the device driver 320 calls a routine, the simulated interrupt controller routine 300, step 343, which simulates the functions of a hardware interrupt controller, e.g. the 8259, step 344. Some of these functions include checking the level of the interrupt, prioritising the interrupts, and checking for masked and unmasked interrupts. For an example, an application 19 can disable different levels of interrupts by masking interrupts. If an application 19 does not support certain I/O devices, it will mask the interrupts from them. Therefore, the simulated interrupt controller routine 300 will determine if an interrupt can be posted to the CPU simulator on the level that the device driver 320 received the interrupt on, step 345. If it cannot, it waits for the next call from a device driver 320-323. If the interrupt can be posted on the same level, a flag is set. When the simulated interrupt controller routine 300 has an interrupt to post to the CPU simulator 10, the routine 300 updates one byte 332, by setting it to zero, of a two byte word (or halfword) 330, step 346. When the halfword 330 becomes zero, there is an interrupt that needs to be serviced. In the two bytes of the halfword 330, the upper byte 332 is owned by the simulation of the interrupt controller 300, and the lower byte 331 is owned by the processor, i.e., the CPU simulator, or vice versa. Most processors will recognise an interrupt when two conditions are true. One is that there is an interrupt being requested, in this case from the simulated interrupt controller routine. The other is that internally the processor is able to service the interrupt. The CPU simulator can disable interrupts, as most processors can. Usually this happens when the processor is dealing with very sensitive data that cannot be inconsistent. If a routine is updating data that is also dealt with in interrupt handlers, the processor will disable interrupts to guarantee that a certain sequence of instructions will be executed atomically without being interrupted. The processor indicates whether it can internally service an interrupt by updating the interrupt flag register in the processor. For the simulated instructions of this invention, some typical instructions used by the processor to disable and enable interrupts through the flags register are described as follows. The CLI (clear interrupt) clears the interrupt enable bit in the flag register of the processor of first processing system being simulated to disable any interrupt requests from the interrupt controller. The STI (set interrupt) instruction sets the interrupt enable bit in the flag register to enable any interrupt requests from the interrupt controller. In addition, there are two instructions, IRET and POPF, which replace the entire contents of the flag register including the interrupt enable bit. As the CPU simulator 10 executes a translation of any one of these instructions, step 360 (Fig.6), it will reflect its interrupt enabling state through the byte 331 of the two byte halfword 330. Fig. 8 shows the translated code required to simulate the STI instruction. The first instruction shown in Fig. 8 illustrates the translation used for the STI instruction which enables the processor to service interrupt requests. The second instruction shown in Fig. 8 updates the byte 331 owned by the simulated processor to reflect the enabled state of the processor. The CPU simulator 10 not only has to be able to recognise the fact that externally an interrupt action is being requested, but that internally the processor is able to service the interrupt. This is done by polling the two bytes 330 in the shared memory segment 16. The one byte 331 of the halfword 330 owned by the CPU would be zero if interrupts are enabled internally in the processor. The other byte 332 owned by the simulated interrupt controller routine 300 would be zero when an interrupt is being requested externally which is of high enough priority as determined by the current priority interrupt level of the simulated interrupt controller routine 300, step 344. The CPU simulator 10 regularly reads the two bytes 330, step 348, until the two bytes 330 become zero, step 349. Key areas in the instruction flow of control of the application 19 are identified in order to minimise the overhead of guaranteeing a responsive acknowledgement of an interrupt request. The two key areas in minimising the overhead of checking for interrupts are 1.) minimising the number of places where interrupts are recognised, and 2.) minimising the amount of work required to determine if an interrupt should be serviced. The simulator 10 relies on information provided by a graph analysis 30, Fig. 3 of a block of first processor instructions 100 to determine where an interrupt request is to be polled in order to minimise the number of places where interrupts are recognised. Although, a graph analysis technique was previously applied in optimising high level language compilers, it is believed that this is the first time that this technique has been applied to the problem of processor I/O simulation. The simulator 10 translates first processor instructions 100 (Fig. 3) into second processor instructions, but does not do the translating one instruction at a time. The simulator 10 examines the first instruction that is about to be executed, and for which there is no translation, and continues examining subsequent instructions while building a graph 30 of those instructions as shown in Fig. 3. When the simulator 10 reaches a new block of first processor instructions 100, step 131, Fig. 4, the simulator 10 invokes the translator 27 to provide a second processor translation, step 132. The translation occurs in three phases. First, a graph 30, Fig. 3, is built, step 133, Fig. 4, which represents the structure of the block of first processor instructions 100. Each node 101 in the graph corresponds to one instruction 100. A first processor instruction decoder 28 fills in each node 101 with information about the instruction 100 including the type 140 of instruction. The instruction type 140 is dependant on the number of descendants of an instruction 100. Each node 101 can have at most two descendants. In the case of sequential instructions 102-105, 107, 109, 111-113, 115-117, which transfer control only to the next sequential instruction in memory, the nodes 101 have only one descendant 103-106, 108, 110, 112-114, 116-118, respectively, as shown in Fig. 3. There can be two descendants in the case of conditional branch instructions 106, 108, which test for a condition and branch to one instruction if the condition is true, and continues with the next instruction if the condition is false. It is possible for a node 101 to have no descendants, as is the case for the interrupt return instruction 114, 118. The instruction 114, 118 that has no descendants illustrates an instruction that transfers control dynamically. A node 101 can have one descendant that is not the sequential instruction. The unconditional jump instruction 110 is an example of this. As shown above, there are four types of instructions 100. These types are numbered in the code as follows. A node 101 is numbered "0" if the instruction at the node has no descendants, i.e., the return instruction 118. A node 101 is numbered "1" if it is a sequential instruction and has one sequential descendant i.e., compare instruction 105. A node 101 is numbered "2" if the instruction has two descendants i.e., jump if equal instruction 106. A node 101 is numbered "3" if the instruction is not a sequential instruction, but has only one descendant, i.e. jump instruction 110. The nodes 101 are allocated in storage 120 sequentially as the translator 27, step 133, Fig. 4, finds them. The search through the application program 19 originally written for the first processor is called a depth first search. The depth first search means that the instructions are searched sequentially until an instruction is reached that has already been visited and stored in memory, e.g. move 104, or an end node such as zero, e.g. the return instruction 114, is reached. If an instruction (e.g. move 104) is reached that has already been stored in memory, and that instruction has a path 123 to the instruction previously stored (e.g.jump 110), then a loop has been encountered, and is recorded in the previously stored instruction (e.g. jump 110). The graph analysis then resumes the depth first search by visiting the previously encountered type 2 node (e.g. jump 108), and then searching sequentially along the alternate path 122 until an instruction is reached that has already been visited and stored in memory, or an end node such as zero, e.g. the return instruction 114, is reached. The depth first search reiterates the above process by visiting the previously encountered type 2 node (e.g. jump 108). If both paths 122, 123 of this instruction have already been followed, the search visits the next previous type 2 instruction (e.g. jump 106) and follows the alternate path 124. The instructions 115-118 are searched sequentially until an instruction is reached that has already been visited and stored in memory, or an end node such as zero, e.g. the return instruction 118, is reached. Second, step 134, Fig. 4, the graph 30 is analysed to determine where interrupts must be polled. An interrupt is polled just prior to all type 0 instructions. In addition, an interrupt is polled just prior to a type 1 instruction, if the type one instruction is a CLI (clear interrupt instruction). An interrupt is polled at a type 2 or 3 instruction only if that instruction closes a loop as determined during the depth first search of the graph analysis. Third, step 136, Fig. 4, the code generator 29 is invoked to translate the graph 30 into second processor instructions. Where it has been determined from the graph analysis that an interrupt will be polled, the translator will insert translated code that checks for an interrupt at that point. As determined above by the graph analysis, interrupts are only checked when an instruction transfers control to a point that cannot be determined statically, (since it requires a value that is known only at run time), i.e., at a node type 0, or when a branch or conditional branch instruction closes a loop. As a further example, Fig. 7 illustrates in a first processing system instruction flow of control, the location for polling for interrupts in order to minimise the number of places where interrupts are recognised. Not only should the number of places where interrupts must be polled be minimised, but the work required to determine if an interrupt should be serviced should also be minimised. Whether an interrupt request should be serviced depends on whether there is a pending interrupt request and whether the processor is currently enabled to service it. The simulator of this invention uses a two byte halfword in a shared memory segment (in a page that is pinned) to indicate the current state of both the interrupt enable flag in the processor, and the incoming interrupt request. The first byte in the halfword contains a zero when the processor is enabled to service interrupts. The second byte contains zero when an interrupt is being requested. The key is that these bytes can be updated atomically by using the STore Character instruction, and can be read simultaneously by using the Load Halfword instruction. This avoids synchronisation problems that occur when a program in a critical section is interrupted and another process updates the same data resulting in an inconsistent state. In the environment of the preferred embodiment, if the IBM RT PC is equipped with an Advanced Processor Card, execution of the Load Halfword instruction will be overlapped with other instructions resulting in further improvement in performance. If no interrupt is to be serviced, which is by far the most common condition, then polling for interrupts costs about 4 machine cycles, about half a microsecond. Referring to Fig. 6, the CPU simulator 10 regularly reads the two bytes 330, step 348, until the two bytes 330 become zero, step 349. When the two bytes becomes zero, the CPU simulator 10 sends an interrupt acknowledge, step 350, to the simulated interrupt controller routine 300. This simulates the mechanism in the hardware by which the processor tells the interrupt controller that it has acknowledged the fact that the hardware has requested an interrupt. The simulated interrupt controller routine 300 returns the type of interrupt level, step 353, to the CPU simulator 10. The interrupt level information is passed by the simulated interrupt controller routine 300 in the form of an interrupt vector which indicates an address location in memory. The CPU simulator 10 receives this information, and goes to memory 16 and loads an address from that specified memory location to call an interrupt handler to process the interrupt. The interrupt handler processes IN and OUT instructions to the physical devices 11 to service the interrupt request. When the interrupt handler completes, it notifies the simulated interrupt controller 300, and the simulated interrupt controller updates its internal status and performs the interrupt controller functions for an end of interrupt, step 354, 355 Fig. 6. The interrupt handler is part of the DOS 18 or BIOS 13 code that is used by the simulated processor. In this way, the CPU simulator 10 determines what needs to be done for each type of interrupt.

Claims: A method of simulating interrupt requests from an I/O device (310-312) to a simulated processor, in a data processing system including a first hardware processor (17) and at least one hardware I/O device, the system running an application program (19) on a simulation of a second hardware processor for which the application program was written, which second hardware processor is different from said first hardware processor, characterised in that the method includes: analyzing (134) a graph providing a graphical representation of the instruction flow of control of the application program to identify blocks of first processor instructions (100) suitable for translation together into second processor instructions, thereby determining when in the instruction flow to poll for interrupts. A method according to claim 1, wherein an interrupt is polled when an instruction transfers control dynamically in the application running on the simulated processor. A method according to claim 2, wherein, on determination of when a specific instruction transfers control dynamically in the application, a poll indicator is inserted in said graphical representation prior to said specific instruction; and, on encountering said poll indicator during execution of said instructions, said simulated processor polls for said interrupt requests. A method according to any preceding claim, including polling for interrupts once each time around a loop in the application running on the simulated processor. A method according to any preceding claim, wherein the simulated processor has a changeable state of enablement for servicing interrupt requests, and a poll for interrupts is performed when an instruction of the application changes the interrupt state of enablement of the simulated processor. A method according to any preceding claim, wherein a first indicator within the data processing system is updated on receipt of an interrupt request, and a second indicator is updated when an interrupt state of enablement of said simulated processor is changed, said polling for interrupts comprising a poll of said first and second indicators with a single simulated processor instruction. A data processing system including a hardware processor (17) and at least one hardware I/O device (310-312) running an application (19) written for a different hardware processor on a simulation of that processor, characterized in that said data processing system includes, in order to simulate interrupt requests from the I/O device to the simulated processor: means (133) for representing the instruction flow of control of the application programm as a graph; means (134) for analyzing said representation as a graph to determine when to poll for interrupts by determining when an instruction transfers control dynamically in the application program; and means for polling for an interrupt. A system according to claim 7, including means for polling for an interrupt each time around a loop in the application. A system according to claim 7 or claim 8, including means for polling for an interrupt when an instruction of the application changes a state of enablement of the simulated processor to service interrupt requests. A system according to any one of claims 7 to 9, including means for simulating an interrupt controller; a first indicator (332) independently updateable by the interrupt controller for indicating an interrupt request to the simulated processor; a second indicator (331) independently updateable by the simulated processor for indicating an interrupt enabled state of the simulated processor; wherein the first and second indicators are arranged to be simultaneously polled by a single simulated processor instruction.

Inventors: DE NICOLAS ARTURO MARTIN, FOGG RICHARD GREGORY JR, O'QUIN JOHN CLAUDE III, DE NICOLAS, ARTURO MARTIN, FOGG, RICHARD GREGORY, JR., O'QUIN, JOHN CLAUDE, III
Applicants: IBM, INTERNATIONAL BUSINESS MACHINES CORPORATION
Application year: 1989
Main classification: G06F9
IPC codes: G06F11, G06F13