It has been fairly typical for processors to only have one interrupt. x86 was like that for a while, maybe still is. Arm has traditionally had two, but the newer cores have many now 32, 256, etc.
Where you have a shared interrupt line, as tangrs mentioned you typically have something outside the processor, in the case of arm, within the chip but outside the arm core itself. Something that does have many interrupt inputs and the output or outputs that go to the processors one or few interrupts. When the processors interrupt occurs then you check with this logic/hardware outside the processor/core to see who caused it, and there you go.
it is also not atypical to have nested interrupt controllers, say for example an 8 input with one output. And for some or each of those 8 inputs another 8 to 1 interrupt controller. The software would then need to simply follow the path. check the first level interrupt controller to see which one(s) fired the interrupt, then from there you know the next layer up controller you need to talk to and so on until you isolate the individual interrupt.
Also know and understand that for these shared interrupt systems, it is quite possible to have multiple interrupts happen "at the same time" basically from the time your program starts stopping and the interrupt vector is called, and you do your interrupt startup stuff and eventually read the interrupt status register, more than one can come in. You need to decide how to handle that and depending on the system/logic if you were to return from one of them the others being asserted might bring you back into the interrupt handler, so that impementation would/could be handle only one of the pendings. Other logic might require you to handle all the pendings before you return.
Since arm doesnt necessarily control what is tied to the interrupt or fiq lines you can get all kinds of solutions from various vendors as to how the interrupt system works for a particular arm chip.