Hi Jgirard,
Yes, I have been doing this since 1985. It really is pretty easy, but there are rules that I need to follow.
First, I allocate one or two bytes of page zero ram for the timer-extension. I have a timer-overflow ISR that increments the extension (either a single INC instruction or three instructions), and also queues an overflow task to run (a single BSET instruction). That task may or may not do anything, but I schedule it anyway. Typically, it just keeps time.
Most of the time I am using the timer with the compare function, which allows me to schedule tasks up to 2.38 hours into the future (with the old HC05 timer at its fixed 2 microsecond resolution, ~8 overflows per second). Usually, a single byte of extension is adequate for me. At a 10mHz count rate, a single byte will get you 1 2/3 seconds before a single-byte timer-extension overflows.
Input-Capture is trickier, as the edge interrupt has a higher priority than the overflow interrupt. If you tried to process your capture totally inside the ISR, you could have a coherency problem. My "rule" of processing outside of the ISR addresses that issue.
Here are some of the rules that I need to follow:
No interrupt service routine may take longer than 5 microseconds. This is to insure that interrupt latency stays reasonably short. 5 microseconds allows me to run two SCI modules at a megabit/second.
All ISRs do only what it takes to clear the interrupt, and then request a processing task to do the bulk of the work (again, a single BSET instruction). So almost all processing is done outside of ISRs where interrupts are enabled.
No decisions are ever made inside an ISR, where things might not be coherent.
Any variables that are accessed inside an ISR are treated as critical-sections outside the ISR. That simply means that interrupts need to be disabled during their accesses (typically for less than a microsecond). Again, for coherency.
With those rules you can be assured that, should an overflow and a capture occur near simultaneously, both ISRs will have been executed before you process the capture (outside any ISR). You still need to determine which event happened first, and I use the high-bit of the 16-bit capture data to make that determination.
This is simply how I do it. There are plenty of other ways. This way is very easy for me because I have had the code for years and I program in assembly language. It would probably be more difficult in C.