Created
December 4, 2021 02:16
-
-
Save heatd/17e365644a7ad9adf1a6d8d636704531 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Dump of assembler code for function _Z12process_exitj: | |
kernel/process.cpp: | |
831 { | |
0xffffffff801111d0 <+0>: push %rbp | |
0xffffffff801111d1 <+1>: mov %rsp,%rbp | |
0xffffffff801111d4 <+4>: push %r15 | |
0xffffffff801111d6 <+6>: push %r14 | |
0xffffffff801111d8 <+8>: push %r13 | |
0xffffffff801111da <+10>: push %r12 | |
0xffffffff801111dc <+12>: push %rbx | |
0xffffffff801111dd <+13>: sub $0x98,%rsp | |
0xffffffff801111e4 <+20>: mov %edi,%ebx | |
include/onyx/scheduler.h: | |
104 return get_per_cpu(current_thread); | |
0xffffffff801111e6 <+22>: mov %gs:0x7feef132(%rip),%r15 # 0x320 <current_thread> | |
0xffffffff801111ee <+30>: mov %gs:0x7feef12a(%rip),%rax # 0x320 <current_thread> | |
include/onyx/process.h: | |
261 return (thread == NULL) ? NULL : (struct process *) thread->owner; | |
0xffffffff801111f6 <+38>: test %rax,%rax | |
0xffffffff801111f9 <+41>: je 0xffffffff8011121e <_Z12process_exitj+78> | |
0xffffffff801111fb <+43>: mov 0x20(%rax),%r13 | |
kernel/process.cpp: | |
835 if(current->get_pid() == 1) | |
0xffffffff801111ff <+47>: cmpl $0x1,0x188(%r13) | |
0xffffffff80111207 <+55>: jne 0xffffffff8011122b <_Z12process_exitj+91> | |
include/onyx/culstring.h: | |
255 return data_; | |
0xffffffff80111209 <+57>: mov 0x10(%r13),%rsi | |
kernel/process.cpp: | |
837 printk("Panic: %s exited with exit code %u!\n", | |
0xffffffff8011120d <+61>: mov $0xffffffff801a9af0,%rdi | |
0xffffffff80111214 <+68>: mov %ebx,%edx | |
0xffffffff80111216 <+70>: xor %eax,%eax | |
0xffffffff80111218 <+72>: call 0xffffffff801a4800 <printk(const char * __restrict__, ...)> | |
--Type <RET> for more, q to quit, c to continue without paging--c | |
include/onyx/x86/include/platform/irq.h: | |
45 __asm__ __volatile__("sti"); | |
0xffffffff8011121d <+77>: sti | |
0xffffffff8011121e <+78>: xor %r13d,%r13d | |
kernel/process.cpp: | |
835 if(current->get_pid() == 1) | |
0xffffffff80111221 <+81>: cmpl $0x1,0x188(%r13) | |
0xffffffff80111229 <+89>: je 0xffffffff80111209 <_Z12process_exitj+57> | |
838 current->cmd_line.c_str(), exit_code); | |
839 irq_enable(); | |
840 while(true); | |
841 } | |
842 | |
843 process_kill_other_threads(); | |
0xffffffff8011122b <+91>: call 0xffffffff801117f0 <_Z26process_kill_other_threadsv> | |
844 | |
845 process_destroy_file_descriptors(current); | |
0xffffffff80111230 <+96>: mov %r13,%rdi | |
0xffffffff80111233 <+99>: call 0xffffffff8014e160 <_Z32process_destroy_file_descriptorsP7process> | |
846 | |
847 current->signal_group_flags |= SIGNAL_GROUP_EXIT; | |
0xffffffff80111238 <+104>: orb $0x4,0xa00(%r13) | |
include/onyx/scheduler.h: | |
104 return get_per_cpu(current_thread); | |
0xffffffff80111240 <+112>: mov %gs:0x7feef0d8(%rip),%rax # 0x320 <current_thread> | |
include/onyx/process.h: | |
261 return (thread == NULL) ? NULL : (struct process *) thread->owner; | |
0xffffffff80111248 <+120>: test %rax,%rax | |
0xffffffff8011124b <+123>: mov %ebx,-0x2c(%rbp) | |
0xffffffff8011124e <+126>: je 0xffffffff80111256 <_Z12process_exitj+134> | |
0xffffffff80111250 <+128>: mov 0x20(%rax),%rdi | |
0xffffffff80111254 <+132>: jmp 0xffffffff80111258 <_Z12process_exitj+136> | |
0xffffffff80111256 <+134>: xor %edi,%edi | |
kernel/process.cpp: | |
704 vm_destroy_addr_space(¤t->address_space); | |
0xffffffff80111258 <+136>: add $0x90,%rdi | |
0xffffffff8011125f <+143>: call 0xffffffff8012b060 <_Z21vm_destroy_addr_spaceP16mm_address_space> | |
705 } | |
706 | |
707 void process_remove_from_list(process *proc) | |
708 { | |
709 { | |
710 scoped_lock g{process_list_lock}; | |
711 /* TODO: Make the list a doubly-linked one, so we're able to tear it down more easily */ | |
712 if(first_process == proc) | |
713 { | |
714 first_process = first_process->next; | |
715 if(process_tail == proc) | |
716 process_tail = first_process; | |
717 } | |
718 else | |
719 { | |
720 process *p; | |
721 for(p = first_process; p->next != proc && p->next; p = p->next); | |
722 | |
723 assert(p->next != nullptr); | |
724 | |
725 p->next = proc->next; | |
726 | |
727 if(process_tail == proc) | |
728 process_tail = p; | |
729 } | |
730 | |
731 } | |
732 | |
733 /* Remove from the sibblings list */ | |
734 | |
735 scoped_lock g{proc->parent->children_lock}; | |
736 | |
737 if(proc->prev_sibbling) | |
738 proc->prev_sibbling->next_sibbling = proc->next_sibbling; | |
739 else | |
740 proc->parent->children = proc->next_sibbling; | |
741 | |
742 if(proc->next_sibbling) | |
743 proc->next_sibbling->prev_sibbling = proc->prev_sibbling; | |
744 } | |
745 | |
746 void process_wait_for_dead_threads(process *process) | |
747 { | |
748 while(process->nr_threads) | |
749 { | |
750 cpu_relax(); | |
751 } | |
752 } | |
753 | |
754 void process_end(process *process) | |
755 { | |
756 process_remove_from_list(process); | |
757 | |
758 process_wait_for_dead_threads(process); | |
759 | |
760 if(process->ctx.cwd) | |
761 fd_put(process->ctx.cwd); | |
762 | |
763 delete process; | |
764 } | |
765 | |
766 void kill_orphaned_pgrp(process *proc) | |
767 { | |
768 scoped_lock g{proc->pgrp_lock}; | |
769 | |
770 auto pgrp = proc->process_group; | |
771 | |
772 if(pgrp->is_orphaned_and_has_stopped_jobs(proc)) | |
773 { | |
774 pgrp->kill_pgrp(SIGHUP, 0, nullptr); | |
775 pgrp->kill_pgrp(SIGCONT, 0, nullptr); | |
776 } | |
777 } | |
778 | |
779 void process_reparent_children(process *proc) | |
780 { | |
781 scoped_lock g{proc->children_lock}; | |
0xffffffff80111264 <+148>: lea 0xb10(%r13),%r14 | |
include/onyx/scoped_lock.h: | |
64 spin_lock(&internal_lock); | |
0xffffffff8011126b <+155>: mov %r14,%rdi | |
0xffffffff8011126e <+158>: call 0xffffffff80117a00 <spin_lock(spinlock*)> | |
kernel/process.cpp: | |
784 process *new_parent = first_process; | |
0xffffffff80111273 <+163>: mov 0xd81de(%rip),%rbx # 0xffffffff801e9458 <first_process> | |
785 | |
786 // I think this is enough? I'm not sure though, Linux does it again on reparenting. | |
787 kill_orphaned_pgrp(proc); | |
0xffffffff8011127a <+170>: mov %r13,%rdi | |
0xffffffff8011127d <+173>: call 0xffffffff801116b0 <_Z18kill_orphaned_pgrpP7process> | |
788 | |
789 if(!proc->children) | |
0xffffffff80111282 <+178>: mov 0xb18(%r13),%r12 | |
0xffffffff80111289 <+185>: test %r12,%r12 | |
0xffffffff8011128c <+188>: je 0xffffffff801112fc <_Z12process_exitj+300> | |
0xffffffff8011128e <+190>: mov %r15,-0x38(%rbp) | |
0xffffffff80111292 <+194>: mov %r12,%rax | |
0xffffffff80111295 <+197>: cs nopw 0x0(%rax,%rax,1) | |
0xffffffff8011129f <+207>: nop | |
795 c->parent = new_parent; | |
0xffffffff801112a0 <+208>: mov %rbx,0xa30(%rax) | |
794 for(process *c = proc->children; c != nullptr; c = c->next_sibbling) | |
0xffffffff801112a7 <+215>: mov 0xb28(%rax),%rax | |
0xffffffff801112ae <+222>: test %rax,%rax | |
0xffffffff801112b1 <+225>: jne 0xffffffff801112a0 <_Z12process_exitj+208> | |
55 scoped_lock g{parent->children_lock}; | |
0xffffffff801112b3 <+227>: lea 0xb10(%rbx),%r15 | |
include/onyx/scoped_lock.h: | |
64 spin_lock(&internal_lock); | |
0xffffffff801112ba <+234>: mov %r15,%rdi | |
0xffffffff801112bd <+237>: call 0xffffffff80117a00 <spin_lock(spinlock*)> | |
kernel/process.cpp: | |
57 process **pp = &parent->children; | |
0xffffffff801112c2 <+242>: add $0xb18,%rbx | |
0xffffffff801112c9 <+249>: xor %eax,%eax | |
0xffffffff801112cb <+251>: nopl 0x0(%rax,%rax,1) | |
0xffffffff801112d0 <+256>: mov %rax,%rcx | |
0xffffffff801112d3 <+259>: mov %rbx,%rdx | |
58 process *p = nullptr; | |
59 | |
60 while(*pp) | |
0xffffffff801112d6 <+262>: mov (%rbx),%rax | |
61 { | |
62 p = *pp; | |
63 pp = &p->next_sibbling; | |
0xffffffff801112d9 <+265>: lea 0xb28(%rax),%rbx | |
60 while(*pp) | |
0xffffffff801112e0 <+272>: test %rax,%rax | |
0xffffffff801112e3 <+275>: jne 0xffffffff801112d0 <_Z12process_exitj+256> | |
64 } | |
65 | |
66 *pp = children; | |
0xffffffff801112e5 <+277>: mov %r12,(%rdx) | |
67 | |
68 children->prev_sibbling = p; | |
0xffffffff801112e8 <+280>: mov %rcx,0xb20(%r12) | |
include/onyx/scoped_lock.h: | |
73 spin_unlock(&internal_lock); | |
0xffffffff801112f0 <+288>: mov %r15,%rdi | |
0xffffffff801112f3 <+291>: call 0xffffffff80117a40 <spin_unlock(spinlock*)> | |
0xffffffff801112f8 <+296>: mov -0x38(%rbp),%r15 | |
0xffffffff801112fc <+300>: mov %r14,%rdi | |
0xffffffff801112ff <+303>: call 0xffffffff80117a40 <spin_unlock(spinlock*)> | |
0xffffffff80111304 <+308>: mov 0xa88(%r13),%rax | |
kernel/process.cpp: | |
854 for(proc_event_sub *s = current->sub_queue; s; s = s->next) | |
0xffffffff8011130b <+315>: test %rax,%rax | |
0xffffffff8011130e <+318>: je 0xffffffff80111320 <_Z12process_exitj+336> | |
855 { | |
856 s->valid_sub = false; | |
0xffffffff80111310 <+320>: movb $0x0,0x10(%rax) | |
0xffffffff80111314 <+324>: mov 0x130(%rax),%rax | |
854 for(proc_event_sub *s = current->sub_queue; s; s = s->next) | |
0xffffffff8011131b <+331>: test %rax,%rax | |
0xffffffff8011131e <+334>: jne 0xffffffff80111310 <_Z12process_exitj+320> | |
857 } | |
858 | |
859 /* Set this in this order exactly */ | |
860 current_thread->flags = THREAD_IS_DYING; | |
0xffffffff80111320 <+336>: movl $0x4,0x30(%r15) | |
861 current_thread->status = THREAD_DEAD; | |
0xffffffff80111328 <+344>: movl $0x4,0x38(%r15) | |
862 | |
863 { | |
864 | |
865 scoped_lock g{current->signal_lock}; | |
0xffffffff80111330 <+352>: lea 0x1d8(%r13),%r14 | |
include/onyx/scoped_lock.h: | |
64 spin_lock(&internal_lock); | |
0xffffffff80111337 <+359>: mov %r14,%rdi | |
0xffffffff8011133a <+362>: call 0xffffffff80117a00 <spin_lock(spinlock*)> | |
0xffffffff8011133f <+367>: mov -0x2c(%rbp),%ebx | |
kernel/process.cpp: | |
866 current->exit_code = exit_code; | |
0xffffffff80111342 <+370>: mov %ebx,0xa20(%r13) | |
0xffffffff80111349 <+377>: mov $0xa08,%edi | |
867 | |
868 /* Finally, wake up any possible concerned parents */ | |
869 wait_queue_wake_all(¤t->parent->wait_child_event); | |
0xffffffff8011134e <+382>: add 0xa30(%r13),%rdi | |
0xffffffff80111355 <+389>: call 0xffffffff80119130 <_Z19wait_queue_wake_allP10wait_queue> | |
include/onyx/scoped_lock.h: | |
73 spin_unlock(&internal_lock); | |
0xffffffff8011135a <+394>: mov %r14,%rdi | |
0xffffffff8011135d <+397>: call 0xffffffff80117a40 <spin_unlock(spinlock*)> | |
kernel/process.cpp: | |
873 siginfo_t info = {}; | |
0xffffffff80111362 <+402>: movq $0x0,-0xb8(%rbp) | |
0xffffffff8011136d <+413>: movq $0x0,-0x40(%rbp) | |
0xffffffff80111375 <+421>: movq $0x0,-0x48(%rbp) | |
0xffffffff8011137d <+429>: movq $0x0,-0x50(%rbp) | |
0xffffffff80111385 <+437>: movq $0x0,-0x58(%rbp) | |
0xffffffff8011138d <+445>: movq $0x0,-0x60(%rbp) | |
0xffffffff80111395 <+453>: movq $0x0,-0x68(%rbp) | |
0xffffffff8011139d <+461>: movq $0x0,-0x70(%rbp) | |
0xffffffff801113a5 <+469>: movq $0x0,-0x78(%rbp) | |
0xffffffff801113ad <+477>: movq $0x0,-0x80(%rbp) | |
0xffffffff801113b5 <+485>: movq $0x0,-0x88(%rbp) | |
0xffffffff801113c0 <+496>: movq $0x0,-0x90(%rbp) | |
0xffffffff801113cb <+507>: movq $0x0,-0x98(%rbp) | |
0xffffffff801113d6 <+518>: movq $0x0,-0xa0(%rbp) | |
0xffffffff801113e1 <+529>: movq $0x0,-0xa8(%rbp) | |
0xffffffff801113ec <+540>: movq $0x0,-0xb0(%rbp) | |
874 | |
875 info.si_signo = SIGCHLD; | |
0xffffffff801113f7 <+551>: movl $0x11,-0xb8(%rbp) | |
include/onyx/process.h: | |
171 return pid_; | |
0xffffffff80111401 <+561>: mov 0x188(%r13),%eax | |
kernel/process.cpp: | |
876 info.si_pid = current->get_pid(); | |
0xffffffff80111408 <+568>: mov %eax,-0xa8(%rbp) | |
877 info.si_uid = current->cred.ruid; | |
0xffffffff8011140e <+574>: mov 0x1b0(%r13),%eax | |
0xffffffff80111415 <+581>: mov %eax,-0xa4(%rbp) | |
0xffffffff8011141b <+587>: movabs $0x431bde82d7b634db,%rcx | |
878 info.si_stime = current->system_time / NS_PER_MS; | |
0xffffffff80111425 <+597>: mov %rcx,%rax | |
0xffffffff80111428 <+600>: mulq 0xa68(%r13) | |
0xffffffff8011142f <+607>: shr $0x12,%rdx | |
0xffffffff80111433 <+611>: mov %rdx,-0x90(%rbp) | |
879 info.si_utime = current->user_time / NS_PER_MS; | |
0xffffffff8011143a <+618>: mov %rcx,%rax | |
0xffffffff8011143d <+621>: mulq 0xa60(%r13) | |
0xffffffff80111444 <+628>: shr $0x12,%rdx | |
0xffffffff80111448 <+632>: mov %rdx,-0x98(%rbp) | |
880 | |
881 if(WIFEXITED(exit_code)) | |
0xffffffff8011144f <+639>: mov %ebx,%eax | |
0xffffffff80111451 <+641>: and $0x7f,%eax | |
0xffffffff80111454 <+644>: je 0xffffffff80111470 <_Z12process_exitj+672> | |
885 } | |
886 else if(WIFSIGNALED(exit_code)) | |
0xffffffff80111456 <+646>: movzwl %bx,%ecx | |
0xffffffff80111459 <+649>: add $0xffffffff,%ecx | |
0xffffffff8011145c <+652>: cmp $0xfe,%ecx | |
0xffffffff80111462 <+658>: ja 0xffffffff80111483 <_Z12process_exitj+691> | |
887 { | |
888 info.si_code = CLD_KILLED; | |
0xffffffff80111464 <+660>: movl $0x2,-0xb0(%rbp) | |
0xffffffff8011146e <+670>: jmp 0xffffffff8011147d <_Z12process_exitj+685> | |
883 info.si_code = CLD_EXITED; | |
0xffffffff80111470 <+672>: movl $0x1,-0xb0(%rbp) | |
884 info.si_status = WEXITSTATUS(exit_code); | |
0xffffffff8011147a <+682>: movzbl %bh,%eax | |
0xffffffff8011147d <+685>: mov %eax,-0xa0(%rbp) | |
889 info.si_status = WTERMSIG(exit_code); | |
890 } | |
891 | |
892 kernel_raise_signal(SIGCHLD, current->parent, 0, &info); | |
0xffffffff80111483 <+691>: mov 0xa30(%r13),%rsi | |
0xffffffff8011148a <+698>: lea -0xb8(%rbp),%rcx | |
0xffffffff80111491 <+705>: mov $0x11,%edi | |
0xffffffff80111496 <+710>: xor %edx,%edx | |
0xffffffff80111498 <+712>: call 0xffffffff80114af0 <_Z19kernel_raise_signaliP7processjP9siginfo_t> | |
893 | |
894 sched_yield(); | |
0xffffffff8011149d <+717>: call 0xffffffff8015e1b0 <_Z11sched_yieldv> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment