| /* TODO: implement me */ |
| void __attribute__((noreturn)) __kernel_vcore_entry(void) |
| { |
| /* The kernel sets the TLS desc for us, based on whatever is in VCPD. |
| * |
| * x86 32-bit TLS is pretty jacked up, so the kernel doesn't set the TLS |
| * desc for us. it's a little more expensive to do it here, esp for |
| * amd64. Can remove this when/if we overhaul 32 bit TLS. |
| * |
| * AFAIK, riscv's TLS changes are really cheap, and they don't do it in |
| * the kernel (yet/ever), so they can set their TLS here too. */ |
| int id = __vcore_id_on_entry; |
| #ifndef __x86_64__ |
| set_tls_desc(vcpd_of(id)->vcore_tls_desc); |
| #endif |
| /* Every time the vcore comes up, it must set that it is in vcore |
| * context. uthreads may share the same TLS as their vcore (when |
| * uthreads do not have their own TLS), and if a uthread was preempted, |
| * __vcore_context == FALSE, and that will continue to be true the next |
| * time the vcore pops up. */ |
| __vcore_context = TRUE; |
| vcore_entry(); |
| fprintf(stderr, "vcore_entry() should never return!\n"); |
| abort(); |
| __builtin_unreachable(); |
| } |