From experience, I started off with hw tasks, i now do software tasks. Pros/cons:
Hardware:
+ on-cpu storing and loading of registers and segments
+ single instruction task switches
+ OS only needs to tell which task to run
+ only 16 bits needed to identify a task
- one GDT entry per task minimum
- if paging, the address space must be aware of each task in order to be able to switch to them (that means using a mediator or having all task segments in all address spaces)
- slower than software
- hardware taskswitching does not exist in longmode (unlike what the previous poster said, newer processors DO support them - they actually must - just not in 64-bit mode)
Software:
+ You can choose what to save and/or modify, instead of forced to a fixed set
+ Threads are not limited to the GDT size
+ Fast
+ You can keep task info in its own address space
- SW Scheduler code seems to be the most error-prone code around
- TSS segment is constant, which either needs you to reload parts of it, keep it all the same, or use paging tricks
Basically, Hardware is easier but rather limited and restrictive, Software needs quite a bit more work, but generally for better results.
And unless you like kernel rewrites you'll have to stick with the approach of your choice. Both are well usable, just pick the one that fits your os design best.
Wikihas a more detailed briefing on the pros and cons.